Script 8 for Kitchel et al.Ā 2024 in prep taxonomic diversity manuscript.

library(data.table)
library(MuMIn)
library(ggplot2)
library(cowplot)
library(lme4)
library(stringr)
library(nlme)

#pull in function to calculate model estimates and standard errors
source(here::here("analysis_code","extract_coefficients_function.R"))

###Predicts annual dissimilarity with annual characteristics, temperature and fishing values

Pull in - region areas (if not already loaded) - region characteristics (if not already loaded); saveRDS(FishGlob_richness_year_survey, file = here::here(ā€œoutputā€,ā€œFishGlob_richness_year_survey.Rdsā€)) - fishing (if not already loaded) - temp (if not already loaded)

Add survey area to dissimilarities data table

#physical area by year
region_area_byyear <- fread(here::here("output","region_area_byyear.csv"))

#merged fishing, temp, dissimilarities
dissimilarities_temp_fishing <- fread(here::here("output","dissimilarities_temp_fishing.csv"))

#combine
dissimilarities_temp_fishing_area <- dissimilarities_temp_fishing[region_area_byyear, on = c("survey_unit","year")]

#only occurrence-based jaccard for these analyses
dissimilarities_temp_fishing_area.jaccard <- dissimilarities_temp_fishing_area[dissimilarity_metric == "jaccard_dissimilarity_index_binary",]

Add in season/Julian day to dissimilarities data table

#load up julian days
dates_regions <- readRDS(here::here("output","dates_regions.rds"))

#most common season per year
# Function to get the most frequent value
get_mode <- function(x) {
  ux <- unique(x)
  ux[which.max(tabulate(match(x, ux)))]
}

# Apply the function to each group
dates_regions.r <- dates_regions[, .(season = get_mode(season)), by = c("survey_unit","year")]


#merge
dissimilarities_temp_fishing_area.jaccard <- dates_regions.r[dissimilarities_temp_fishing_area.jaccard, on = c("survey_unit","year")]

Pull in palette and name helper

source(here::here("analysis_code","color_links.R"))

Pull in observed dissimilarity trend values

jaccard_total_coefs.r <- fread(here::here("output","jaccard_total_coefs.r.csv"))

Plot fishing and temperature vs.Ā time for all regions

#######TEMPERATURE

#set order by survey unit for plotting
all_surveys <- levels(as.factor(dissimilarities_temp_fishing_area.jaccard$survey_unit))
setorder(dissimilarities_temp_fishing_area.jaccard, survey_unit)

dissimilarities_temp_fishing_area.jaccard[,Survey_Name_Season:=factor(Survey_Name_Season, levels = unique(dissimilarities_temp_fishing_area.jaccard$Survey_Name_Season), ordered = T)]

(sbt_time_survey_facet_1_20 <- ggplot(data = dissimilarities_temp_fishing_area.jaccard[survey_unit %in% all_surveys[1:20] & year > 1979]) +
  labs(y = "Mean bottom temperature (˚C)",  x = "Year") +
  geom_point(aes(y = as.numeric(yearly_mean_bypoint_avg), x = year), alpha = 0.3) +
  geom_smooth(aes(y = as.numeric(yearly_mean_bypoint_avg), x = year), method = "lm") +
  scale_x_continuous(breaks = ~ axisTicks(., log = FALSE)) +
  theme_classic() +
  theme(axis.text.x = element_text(size = 7)) +
  facet_wrap(~Survey_Name_Season, scales= "free", ncol = 4))

ggsave(sbt_time_survey_facet_1_20, path = here::here("figures"), filename = "sbt_time_survey_facet_1_20.jpg", height = 12, width =9)


(sbt_time_survey_facet_21_34 <- ggplot(data = dissimilarities_temp_fishing_area.jaccard[survey_unit %in% all_surveys[21:34] & year > 1979]) +
  labs(y = "Mean bottom temperature (˚C)",  x = "Year") +
  geom_point(aes(y = as.numeric(yearly_mean_bypoint_avg), x = year), alpha = 0.3) +
  geom_smooth(aes(y = as.numeric(yearly_mean_bypoint_avg), x = year), method = "lm") +
  scale_x_continuous(breaks = ~ axisTicks(., log = FALSE)) +
  theme_classic() +
  theme(axis.text.x = element_text(size = 7)) +
  facet_wrap(~Survey_Name_Season, scales= "free", ncol = 4))

ggsave(sbt_time_survey_facet_21_34, path = here::here("figures"), filename = "sbt_time_survey_facet_21_34.jpg", height = 12, width =9)


#######FISHING

dissimilarities_temp_fishing_area.jaccard.cc <- dissimilarities_temp_fishing_area.jaccard[complete.cases(dissimilarities_temp_fishing_area.jaccard[,summed_tonnes_scaled_byreg]),]

(fishing_time_survey_facet_1_20 <- ggplot(data = dissimilarities_temp_fishing_area.jaccard.cc[survey_unit %in% all_surveys[1:20] & year > 1979]) +
  labs(y = "Relative fishing catch",  x = "Year") +
  geom_point(aes(y = summed_tonnes_scaled_byreg, x = year), alpha = 0.3) +
  geom_smooth(aes(y = summed_tonnes_scaled_byreg, x = year), method = "lm") +
  scale_x_continuous(breaks = ~ axisTicks(., log = FALSE)) +
  theme_classic() +
  theme(axis.text.x = element_text(size = 7)) +
  facet_wrap(~Survey_Name_Season, scales= "free", ncol = 4))

ggsave(fishing_time_survey_facet_1_20, path = here::here("figures"), filename = "fishing_time_survey_facet_1_20.jpg", height = 12, width =9)


(fishing_time_survey_facet_21_34 <- ggplot(data = dissimilarities_temp_fishing_area.jaccard.cc[survey_unit %in% all_surveys[c(21:34)] & year > 1979]) +
  labs(y = "Relative fishing catch",  x = "Year") +
  geom_point(aes(y = summed_tonnes_scaled_byreg, x = year), alpha = 0.3) +
  geom_smooth(aes(y = summed_tonnes_scaled_byreg, x = year), method = "lm") +
  scale_x_continuous(breaks = ~ axisTicks(., log = FALSE)) +
  theme_classic() +
  theme(axis.text.x = element_text(size = 7)) +
  facet_wrap(~Survey_Name_Season, scales= "free", ncol = 4))

ggsave(fishing_time_survey_facet_21_34, path = here::here("figures"), filename = "fishing_time_survey_facet_21_34.jpg", height = 12, width =9)

NA
NA

Plot fishing and temperature vs.Ā dissimilarity for all regions

#####MEAN TEMP
(preds_sbt_mean_temp_survey_facet_1_20 <- ggplot(data = dissimilarities_temp_fishing_area.jaccard[survey_unit %in% all_surveys[1:20] & year > 1979]) +
  labs(x = "Mean bottom temperature (˚C)",  y = "β-diversity") +
  geom_point(aes(x = as.numeric(yearly_mean_bypoint_avg), y = annual_dissimilarity_value), alpha = 0.3) +
  geom_smooth(aes(x = as.numeric(yearly_mean_bypoint_avg), y = annual_dissimilarity_value), method = "lm") +
  facet_wrap(~Survey_Name_Season, scales= "free", ncol = 4) +
  theme_classic())

ggsave(preds_sbt_mean_temp_survey_facet_1_20, path = here::here("figures"), filename = "preds_sbt_mean_temp_survey_facet_1_20.jpg", height = 12, width =9)


(preds_sbt_mean_temp_survey_facet_21_34 <- ggplot(data = dissimilarities_temp_fishing_area.jaccard[survey_unit %in% all_surveys[21:34] & year > 1979]) +
  labs(x = "Mean bottom temperature (˚C)",  y = "β-diversity") +
  geom_point(aes(x = as.numeric(yearly_mean_bypoint_avg), y = annual_dissimilarity_value), alpha = 0.3) +
  geom_smooth(aes(x = as.numeric(yearly_mean_bypoint_avg), y = annual_dissimilarity_value), method = "lm") +
  facet_wrap(~Survey_Name_Season, scales= "free", ncol = 4) +
  theme_classic())

ggsave(preds_sbt_mean_temp_survey_facet_21_34, path = here::here("figures"), filename = "preds_sbt_mean_temp_survey_facet_21_34.jpg", height = 12, width =9)


#####MINIMUM TEMP
(preds_sbt_min_temp_survey_facet_1_20 <- ggplot(data = dissimilarities_temp_fishing_area.jaccard[survey_unit %in% all_surveys[1:20] & year > 1979]) +
  labs(x = "Minimum bottom temperature (˚C)",  y = "β-diversity") +
  geom_point(aes(x = as.numeric(yearly_min_bypoint_avg), y = annual_dissimilarity_value), alpha = 0.3) +
  geom_smooth(aes(x = as.numeric(yearly_min_bypoint_avg), y = annual_dissimilarity_value), method = "lm") +
  facet_wrap(~Survey_Name_Season, scales= "free", ncol = 4) +
  theme_classic())

ggsave(preds_sbt_min_temp_survey_facet_1_20, path = here::here("figures"), filename = "preds_sbt_min_temp_survey_facet_1_20.jpg", height = 12, width =9)


(preds_sbt_min_temp_survey_facet_21_34 <- ggplot(data = dissimilarities_temp_fishing_area.jaccard[survey_unit %in% all_surveys[21:34] & year > 1979]) +
  labs(x = "Minimum bottom temperature (˚C)",  y = "β-diversity") +
  geom_point(aes(x = as.numeric(yearly_min_bypoint_avg), y = annual_dissimilarity_value), alpha = 0.3) +
  geom_smooth(aes(x = as.numeric(yearly_min_bypoint_avg), y = annual_dissimilarity_value), method = "lm") +
  facet_wrap(~Survey_Name_Season, scales= "free", ncol = 4) +
  theme_classic())

ggsave(preds_sbt_min_temp_survey_facet_21_34, path = here::here("figures"), filename = "preds_sbt_min_temp_survey_facet_21_34.jpg", height = 12, width =9)


#######FISHING

dissimilarities_temp_fishing_area.jaccard.cc <- dissimilarities_temp_fishing_area.jaccard[complete.cases(dissimilarities_temp_fishing_area.jaccard[,summed_tonnes_scaled_byreg]),]

(preds_sbt_mean_fishing_survey_facet_1_20 <- ggplot(data = dissimilarities_temp_fishing_area.jaccard.cc[survey_unit %in% all_surveys[1:20] & year > 1979]) +
  labs(x = "Relative fishing catch",  y = "β-diversity") +
  geom_point(aes(x = summed_tonnes_scaled_byreg, y = annual_dissimilarity_value), alpha = 0.3) +
  geom_smooth(aes(x = summed_tonnes_scaled_byreg, y = annual_dissimilarity_value), method = "lm") +
  facet_wrap(~Survey_Name_Season, scales= "free", ncol = 4) +
  theme_classic())

ggsave(preds_sbt_mean_fishing_survey_facet_1_20, path = here::here("figures"), filename = "preds_sbt_mean_fishing_survey_facet_1_20.jpg", height = 12, width =9)


(preds_sbt_mean_fishing_survey_facet_21_34 <- ggplot(data = dissimilarities_temp_fishing_area.jaccard.cc[survey_unit %in% all_surveys[c(21:34)] & year > 1979]) +
  labs(x = "Relative fishing catch",  y = "β-diversity") +
  geom_point(aes(x = summed_tonnes_scaled_byreg, y = annual_dissimilarity_value), alpha = 0.3) +
  geom_smooth(aes(x = summed_tonnes_scaled_byreg, y = annual_dissimilarity_value), method = "lm") +
  facet_wrap(~Survey_Name_Season, scales= "free", ncol = 4) +
  theme_classic())

ggsave(preds_sbt_mean_fishing_survey_facet_21_34, path = here::here("figures"), filename = "preds_sbt_mean_fishing_survey_facet_21_34.jpg", height = 12, width =9)

NA
NA

###Plot number of tows per year per region

tows_year <- unique(dissimilarities_temp_fishing_area.jaccard[,.(survey_unit, haul_id_count_annual, area_km, year, Survey_Name_Season)])

min_haul_density <- min(tows_year$haul_id_count_annual/tows_year$area_km)
max_haul_density <- max(tows_year$haul_id_count_annual/tows_year$area_km)

(tow_density_survey_facet_1_20 <- ggplot(data = tows_year[survey_unit %in% all_surveys[1:20]]) +
  labs(x = "Year",  y = expression("Tow density (tows per km"^2*")")) +
  geom_point(aes(x = year, y = haul_id_count_annual/area_km)) +
  ylim(c(min_haul_density-0.0001, max_haul_density+0.0001)) +
  facet_wrap(~Survey_Name_Season, ncol = 4) +
  theme_classic())

ggsave(tow_density_survey_facet_1_20, path = here::here("figures"), filename = "tow_density_survey_facet_1_20.jpg", height = 12, width =9)


(tow_density_survey_facet_21_34 <- ggplot(data = tows_year[survey_unit %in% all_surveys[21:34]]) +
  labs(x = "Year",  y = expression("Tow density (tows per km"^2*")")) +
  geom_point(aes(x = year, y = haul_id_count_annual/area_km)) +
  ylim(c(min_haul_density-0.0001, max_haul_density+0.0001)) +
  facet_wrap(~Survey_Name_Season, ncol = 4) +
  theme_classic())

ggsave(tow_density_survey_facet_21_34, path = here::here("figures"), filename = "tow_density_survey_facet_21_34.jpg", height = 12, width =9)

#minimum and maximum dissimilarity value
min_dissimilarity <- min(dissimilarities_temp_fishing_area.jaccard$annual_dissimilarity_value)
max_dissimilarity <- max(dissimilarities_temp_fishing_area.jaccard$annual_dissimilarity_value)

#how does tow density vary with dissimilarity?
tow_density_dissimilarity_1_20 <- 
  ggplot(data = dissimilarities_temp_fishing_area.jaccard[dissimilarity_metric == "jaccard_dissimilarity_index_binary" & survey_unit %in% all_surveys[1:20]]) +
  geom_point(aes(x = (haul_id_count_annual/area_km), y = annual_dissimilarity_value, color = year), size = 2) +
  viridis::scale_color_viridis() +
  facet_wrap(~Survey_Name_Season, ncol = 4, scales = "free") +
  labs(x = expression("Tow density (tows per km"^2*")"), y = "β-diversity", color = "Year") +
   # xlim(c(min_haul_density-0.0001, max_haul_density+0.0001)) +
   # ylim(c(min_dissimilarity-0.01,max_dissimilarity+0.01)) +
  theme_classic() +
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust = 1))

ggsave(tow_density_dissimilarity_1_20, path = here::here("figures"), filename = "tow_density_dissimilarity_1_20.jpg", height = 12, width =9)

tow_density_dissimilarity_21_34 <- 
  ggplot(data = dissimilarities_temp_fishing_area.jaccard[dissimilarity_metric == "jaccard_dissimilarity_index_binary" & survey_unit %in% all_surveys[21:34]]) +
  geom_point(aes(x = (haul_id_count_annual/area_km), y = annual_dissimilarity_value, color = year), size = 2) +
  viridis::scale_color_viridis() +
  facet_wrap(~Survey_Name_Season, ncol = 4, scales = "free") +
  labs(x = expression("Tow density (tows per km"^2*")"), y = "β-diversity", color = "Year") +
   # xlim(c(min_haul_density-0.0001, max_haul_density+0.0001)) +
   # ylim(c(min_dissimilarity-0.01,max_dissimilarity+0.01)) +
  theme_classic() +
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust = 1))

ggsave(tow_density_dissimilarity_21_34, path = here::here("figures"), filename = "tow_density_dissimilarity_21_34.jpg", height = 12, width =9)



#Plot all at once?
tow_density_dissimilarity <- 
  ggplot(data = dissimilarities_temp_fishing_area.jaccard[dissimilarity_metric == "jaccard_dissimilarity_index_binary"]) +
  geom_point(aes(x = (haul_id_count_annual/area_km), y = annual_dissimilarity_value, color = Survey_Name_Season), size = 2) +
  scale_color_manual(values = color_link$hex) +
  labs(x = expression("Tow density (tows per km"^2*")"), y = "β-diversity", color = "Year") +
   # xlim(c(min_haul_density-0.0001, max_haul_density+0.0001)) +
   # ylim(c(min_dissimilarity-0.01,max_dissimilarity+0.01)) +
  theme_classic()

#and by numbers?
result <- dissimilarities_temp_fishing_area.jaccard[, .(max_density = max(haul_id_count_annual/area_km, na.rm = TRUE), 
                 min_density = min(haul_id_count_annual/area_km, na.rm = TRUE)), 
             by = Survey_Name_Season]

result[,range:= max_density-min_density]

ggplot(data = result) +
  geom_point(aes(x = Survey_Name_Season, y = range)) +
  theme_classic() +
  labs(x = "",y = "Range of tow density values in tow/km^2") +
  theme(axis.text.x = element_text(angle = 45, hjust=1))

Plot dissimilarity by season of sampling

dissimilarities_temp_fishing_area.jaccard[,season := factor(season, levels = c("Spring","Summer","Fall","Winter"))]

ggplot(dissimilarities_temp_fishing_area.jaccard) +
  geom_boxplot(aes(x = season, y = annual_dissimilarity_value)) +
  theme_classic()

###Set up dredge to identify best performing models

First, make data table of model covariates


options(na.action = "na.fail")

dissimilarity_covariates_dredge.dt <- dissimilarities_temp_fishing_area.jaccard[,.
                  (year, survey_unit,
                    yearly_mean_bypoint_avg, yearly_max_bypoint_avg, yearly_min_bypoint_avg,yearly_seas_bypoint_avg,
                    yearly_mean_bypoint_SD, yearly_max_bypoint_SD, yearly_min_bypoint_SD,yearly_seas_bypoint_SD,
                    yearly_mean_bypoint_avg.s, yearly_max_bypoint_avg.s, yearly_min_bypoint_avg.s,yearly_seas_bypoint_avg.s,
                    annual_dissimilarity_value,
                    haul_id_count_annual,
                    spp_count_annual, depth_annual_avg,
                    depth_annual_range, latitude_annual_avg,
                    latitude_annual_range, area_km, season, summed_tonnes_scaled_byreg)]

#merge in with colors for plotting predictions by survey
dissimilarity_covariates_dredge.dt <- color_link[dissimilarity_covariates_dredge.dt, on = "survey_unit"]

#If NA for any covariate, delete row
#View(dissimilarity_covariates_dredge.dt)
#Deleted:
  #Before 1980 and after 2019
  #Gulf of Saint Laurence South (no depth data)
  #No clear SAU match for Rockall Plateau
dissimilarity_covariates_dredge.dt <- dissimilarity_covariates_dredge.dt[complete.cases(dissimilarity_covariates_dredge.dt)]

#Scale and center variables that are not yet scaled and centered
dissimilarity_covariates_dredge.dt[, yearly_mean_bypoint_avg.scaledacrossall := scale(yearly_mean_bypoint_avg)][, yearly_mean_bypoint_SD.scaledacrossall := scale(yearly_mean_bypoint_SD)][, yearly_min_bypoint_avg.scaledacrossall := scale(yearly_min_bypoint_avg)][, yearly_max_bypoint_avg.scaledacrossall := scale(yearly_max_bypoint_avg)][, yearly_seas_bypoint_avg.scaledacrossall := scale(yearly_seas_bypoint_avg)][,haul_id_count_annual.scaledacrossall := scale(haul_id_count_annual)][,spp_count_annual.scaledacrossall := scale(spp_count_annual)][,depth_annual_avg.scaledacrossall := scale(depth_annual_avg)][,depth_annual_range.scaledacrossall := scale(depth_annual_range)] [,latitude_annual_avg.scaledacrossall := scale(latitude_annual_avg)][,latitude_annual_range.scaledacrossall := scale(latitude_annual_range)][,area_km.scaledacrossall := scale(area_km)]
####Global model contenders
temp * survey_unit + fishing * survey_unit + area + latitude range + latitude average + depth range + depth average + spp count + # of hauls + season + AR for year (optional, will see if this performs better or worse with AR1)

For temperature, we will compare performance of: -mean (scaled across all regions) -max (scaled across all regions) -min (scaled across all regions) -seas (scaled across all regions) -SD (scaled across all regions)

Comparing temp variables AND the presence/absence of a temporal autocorrelation term


#mean temperature
global_mod_mean_temp_lm <- lm(annual_dissimilarity_value ~ 
                             survey_unit*yearly_mean_bypoint_avg.scaledacrossall + #temp and survey unit (possible interaction)
                             survey_unit*summed_tonnes_scaled_byreg + #fishing effort and survey unit (possible interaction)
                             area_km.scaledacrossall + #area
                             latitude_annual_range.scaledacrossall + #latitude range
                             latitude_annual_avg.scaledacrossall + #latitude avg
                             depth_annual_range.scaledacrossall + #depth range
                             depth_annual_avg.scaledacrossall + #depth avg
                             spp_count_annual.scaledacrossall + #spp #
                             haul_id_count_annual.scaledacrossall +
                             season,
                             data = dissimilarity_covariates_dredge.dt)

#with temporal autocorrelation
global_mod_mean_temp_gls <- gls(annual_dissimilarity_value ~ 
                             survey_unit*yearly_mean_bypoint_avg.scaledacrossall + #temp and survey unit (possible interaction)
                             survey_unit*summed_tonnes_scaled_byreg + #fishing effort and survey unit (possible interaction)
                             area_km.scaledacrossall + #area
                             latitude_annual_range.scaledacrossall + #latitude range
                             latitude_annual_avg.scaledacrossall + #latitude avg
                             depth_annual_range.scaledacrossall + #depth range
                             depth_annual_avg.scaledacrossall + #depth avg
                             spp_count_annual.scaledacrossall + #spp #
                             haul_id_count_annual.scaledacrossall +
                            season,
                           correlation = corAR1(form=~year | survey_unit),
                             data = dissimilarity_covariates_dredge.dt)
#maximum temperature
global_mod_max_temp_lm <- lm(annual_dissimilarity_value ~ 
                             survey_unit*yearly_max_bypoint_avg.scaledacrossall + #temp and survey unit (possible interaction)
                             survey_unit*summed_tonnes_scaled_byreg + #fishing effort and survey unit (possible interaction)
                             area_km.scaledacrossall + #area
                             latitude_annual_range.scaledacrossall + #latitude range
                             latitude_annual_avg.scaledacrossall + #latitude avg
                             depth_annual_range.scaledacrossall + #depth range
                             depth_annual_avg.scaledacrossall + #depth avg
                             spp_count_annual.scaledacrossall + #spp #
                             haul_id_count_annual.scaledacrossall +
                            season,
                             data = dissimilarity_covariates_dredge.dt)

#with temporal autocorrelation
global_mod_max_temp_gls <-gls(annual_dissimilarity_value ~ 
                             survey_unit*yearly_max_bypoint_avg.scaledacrossall + #temp and survey unit (possible interaction)
                             survey_unit*summed_tonnes_scaled_byreg + #fishing effort and survey unit (possible interaction)
                             area_km.scaledacrossall + #area
                             latitude_annual_range.scaledacrossall + #latitude range
                             latitude_annual_avg.scaledacrossall + #latitude avg
                             depth_annual_range.scaledacrossall + #depth range
                             depth_annual_avg.scaledacrossall + #depth avg
                             spp_count_annual.scaledacrossall + #spp #
                             haul_id_count_annual.scaledacrossall +
                            season,
                            correlation = corAR1(form=~year | survey_unit),
                             data = dissimilarity_covariates_dredge.dt)
#minimum temperature
global_mod_min_temp_lm <- lm(annual_dissimilarity_value ~ 
                             survey_unit*yearly_min_bypoint_avg.scaledacrossall + #temp and survey unit (possible interaction)
                             survey_unit*summed_tonnes_scaled_byreg + #fishing effort and survey unit (possible interaction)
                             area_km.scaledacrossall + #area
                             latitude_annual_range.scaledacrossall + #latitude range
                             latitude_annual_avg.scaledacrossall + #latitude avg
                             depth_annual_range.scaledacrossall + #depth range
                             depth_annual_avg.scaledacrossall + #depth avg
                             spp_count_annual.scaledacrossall + #spp #
                             haul_id_count_annual.scaledacrossall +
                            season,
                             data = dissimilarity_covariates_dredge.dt)

dissimilarity_covariates_dredge.dt[, survey_unit := factor(survey_unit, levels = sort(all_surveys))]

#with temporal autocorrelation
global_mod_min_temp_gls <-gls(annual_dissimilarity_value ~ 
                             survey_unit*yearly_min_bypoint_avg.scaledacrossall + #temp and survey unit (possible interaction)
                             survey_unit*summed_tonnes_scaled_byreg + #fishing effort and survey unit (possible interaction)
                             area_km.scaledacrossall + #area
                             latitude_annual_range.scaledacrossall + #latitude range
                             latitude_annual_avg.scaledacrossall + #latitude avg
                             depth_annual_range.scaledacrossall + #depth range
                             depth_annual_avg.scaledacrossall + #depth avg
                             spp_count_annual.scaledacrossall + #spp #
                             haul_id_count_annual.scaledacrossall +
                            season,
                            correlation = corAR1(form=~year | survey_unit),
                             data = dissimilarity_covariates_dredge.dt)

#temperature seasonality
global_mod_seas_temp_lm <- lm(annual_dissimilarity_value ~ 
                             survey_unit*yearly_seas_bypoint_avg.scaledacrossall + #temp and survey unit (possible interaction)
                             survey_unit*summed_tonnes_scaled_byreg + #fishing effort and survey unit (possible interaction)
                             area_km.scaledacrossall + #area
                             latitude_annual_range.scaledacrossall + #latitude range
                             latitude_annual_avg.scaledacrossall + #latitude avg
                             depth_annual_range.scaledacrossall + #depth range
                             depth_annual_avg.scaledacrossall + #depth avg
                             spp_count_annual.scaledacrossall + #spp #
                             haul_id_count_annual.scaledacrossall +
                             season,
                             data = dissimilarity_covariates_dredge.dt)

#with temporal autocorrelation
global_mod_seas_temp_gls <- gls(annual_dissimilarity_value ~ 
                             survey_unit*yearly_seas_bypoint_avg.scaledacrossall + #temp and survey unit (possible interaction)
                             survey_unit*summed_tonnes_scaled_byreg + #fishing effort and survey unit (possible interaction)
                             area_km.scaledacrossall + #area
                             latitude_annual_range.scaledacrossall + #latitude range
                             latitude_annual_avg.scaledacrossall + #latitude avg
                             depth_annual_range.scaledacrossall + #depth range
                             depth_annual_avg.scaledacrossall + #depth avg
                             spp_count_annual.scaledacrossall + #spp #
                             haul_id_count_annual.scaledacrossall +
                             season,
                             correlation = corAR1(form=~year | survey_unit),
                             data = dissimilarity_covariates_dredge.dt)

#standard deviation
global_mod_SD_temp_lm <- lm(annual_dissimilarity_value ~ 
                             survey_unit*yearly_mean_bypoint_SD.scaledacrossall + #temp and survey unit (possible interaction)
                             survey_unit*summed_tonnes_scaled_byreg + #fishing effort and survey unit (possible interaction)
                             area_km.scaledacrossall + #area
                             latitude_annual_range.scaledacrossall + #latitude range
                             latitude_annual_avg.scaledacrossall + #latitude avg
                             depth_annual_range.scaledacrossall + #depth range
                             depth_annual_avg.scaledacrossall + #depth avg
                             spp_count_annual.scaledacrossall + #spp #
                             haul_id_count_annual.scaledacrossall +
                           season,
                             data = dissimilarity_covariates_dredge.dt)

#with temporal autocorrelation
global_mod_SD_temp_gls <- gls(annual_dissimilarity_value ~ 
                             survey_unit*yearly_mean_bypoint_SD.scaledacrossall + #temp and survey unit (possible interaction)
                             survey_unit*summed_tonnes_scaled_byreg + #fishing effort and survey unit (possible interaction)
                             area_km.scaledacrossall + #area
                             latitude_annual_range.scaledacrossall + #latitude range
                             latitude_annual_avg.scaledacrossall + #latitude avg
                             depth_annual_range.scaledacrossall + #depth range
                             depth_annual_avg.scaledacrossall + #depth avg
                             spp_count_annual.scaledacrossall + #spp #
                             haul_id_count_annual.scaledacrossall +
                           season,
                              correlation = corAR1(form=~year | survey_unit),
                             data = dissimilarity_covariates_dredge.dt)

#Compare AICcs
View(AICc(global_mod_mean_temp_lm, global_mod_max_temp_lm, global_mod_min_temp_lm, global_mod_seas_temp_lm, global_mod_SD_temp_lm,
          global_mod_mean_temp_gls, global_mod_max_temp_gls, global_mod_min_temp_gls, global_mod_seas_temp_gls, global_mod_SD_temp_gls))

#build data table to report AICc
global_mod_temp_table <- data.table(
  `Temporal autocorrelation` = c(
    c(rep(F,5),rep(T,5))
  ),
  `Temperature variable` = rep(c(                  
              "Average mean SBT",
              "Average maximum SBT",                        
              "Average minimum SBT",                  
              "Average SBT seasonality",                 
              "SBT SD"),2),
  deltaAICc = signif(min(AICc(global_mod_mean_temp_lm, global_mod_max_temp_lm, global_mod_min_temp_lm, global_mod_seas_temp_lm, global_mod_SD_temp_lm,
          global_mod_mean_temp_gls, global_mod_max_temp_gls, global_mod_min_temp_gls, global_mod_seas_temp_gls, global_mod_SD_temp_gls)[,2])-AICc(global_mod_mean_temp_lm, global_mod_max_temp_lm, global_mod_min_temp_lm, global_mod_seas_temp_lm, global_mod_SD_temp_lm,
          global_mod_mean_temp_gls, global_mod_max_temp_gls, global_mod_min_temp_gls, global_mod_seas_temp_gls, global_mod_SD_temp_gls)[,2],2))

#order by aicc
setorder(global_mod_temp_table,cols = -"deltaAICc")

global_mod_temp_table[,Rank := seq(1,10,by = 1)]

global_mod_sbt_table <- global_mod_temp_table[,.(Rank,`Temporal autocorrelation`,`Temperature variable`, deltaAICc)]

fwrite(global_mod_sbt_table, here::here("output","global_mod_sbt_table.csv"))

####Best performing global model includes minimum temperature (centered and scaled) (Still the case as of July 17, 2024)

Now, look at different combinations of all predictors (min temp) using dredge

Global model: global_mod_min_temp

options(na.action = "na.fail") #  prevent fitting sub-models to different datasets
dd <- dredge(global_mod_min_temp_lm)
Fixed term is "(Intercept)"
dd.dt <- data.table(dd)
View(dd)

#only models less than 2 delta AICc (2 models)
dd.dt.2 <- dd.dt[delta <= 2,]

colnames(dd.dt.2)
 [1] "(Intercept)"                                       
 [2] "area_km.scaledacrossall"                           
 [3] "depth_annual_avg.scaledacrossall"                  
 [4] "depth_annual_range.scaledacrossall"                
 [5] "haul_id_count_annual.scaledacrossall"              
 [6] "latitude_annual_avg.scaledacrossall"               
 [7] "latitude_annual_range.scaledacrossall"             
 [8] "season"                                            
 [9] "spp_count_annual.scaledacrossall"                  
[10] "summed_tonnes_scaled_byreg"                        
[11] "survey_unit"                                       
[12] "yearly_min_bypoint_avg.scaledacrossall"            
[13] "summed_tonnes_scaled_byreg:survey_unit"            
[14] "survey_unit:yearly_min_bypoint_avg.scaledacrossall"
[15] "df"                                                
[16] "logLik"                                            
[17] "AICc"                                              
[18] "delta"                                             
[19] "weight"                                            
#in this step, we delete coefficient values because we will pull them back in later when we calculate both SE and coefficients (other than interaction, which we keep here)
dd.dt.2.formatted <- dd.dt.2[,Rank := as.numeric(rownames(dd.dt.2))][,.(Rank,
                                `summed_tonnes_scaled_byreg:survey_unit`,
                                `survey_unit:yearly_min_bypoint_avg.scaledacrossall`,
                                delta,
                                weight, survey_unit, season
                                )]

#add r-squared values
# Iterate through the best models and extract R-squared values
r_squared_values <-list()
for (i in 1:nrow(dd.dt.2.formatted)) {
  summary_data <- summary(get.models(dd, subset = i)[[1]])
  r_squared <- signif(summary_data$r.squared,2)
  r_squared_values <- unlist(c(r_squared_values,r_squared))
}

dd.dt.2.formatted[,"R squared" := r_squared_values]

#empty data table

model_coef_se_fill <- data.table(Rank = as.numeric(), coef_name = as.character(),coef = as.numeric(), se = as.numeric())

for (i in 1:nrow(dd.dt.2.formatted)){
  model_coef_se_single <- data.table(unlist(coefTable(dd,full = T)[[i]]))
  model_coef_se_single[,coef_names := rownames(unlist(coefTable(dd,full = T)[[i]]))]
  model_coef_se_single[,Rank := i]
  
  colnames(model_coef_se_single) <- c("coef","se","df","coef_name","Rank")
  
  #reduce to columns we need
  model_coef_se_single <- model_coef_se_single[,.(Rank, coef_name, coef, se)]
  
  model_coef_se_fill <- rbind(model_coef_se_fill,model_coef_se_single)
}

#format to merge with model rankings and averaged model
model_coef_se_fill[,coef_se := paste0(round(coef,3)," ± ",round(se,3))]

#delete extra columns
model_coef_se_fill <- model_coef_se_fill[,.(Rank,coef_name,coef_se)]

#long to wide
model_coef_se_fill.w <- dcast(model_coef_se_fill, formula = Rank ~ coef_name, value.var = c("coef_se"))

#merge model_coef_se_fill with dd.dt.2.formatted
model_coef_se_AIC <- dd.dt.2.formatted[model_coef_se_fill.w, on = "Rank"]

#model average all models with delta < 4 (8 models)
model_avg_delta4 <-model.avg(dd, subset = delta < 4, fit = T) #NB: The ā€˜subset’ (or ā€˜conditional’) average only   averages over the models where the parameter appears. An alternative, the ā€˜full’ average assumes that a variable is included in every model, but in some models the corresponding coefficient (and its respective variance) is set to zero. Unlike the ā€˜subset average’, it does not have a tendency of biasing the value away from zero. The ā€˜full’ average is a type of shrinkage estimator, and for variables with a weak relationship to the response it is smaller than ā€˜subset’ estimators., fit = T fits the component models again

model_avg_values <- as.data.table(coefTable(model_avg_delta4,fill = T)) # with SE
coef_names <- names(coef(model.avg(dd, subset = delta < 4)))
model_avg_values[,coef_name:=coef_names][,coef:=Estimate][,Estimate:=NULL][,df:=NULL][,se:= `Std. Error`][,`Std. Error` := NULL]

#new column with coef and SE
model_avg_values[,coef_se := paste0(round(coef,3)," ± ",round(se,3))]

#long to wide for model avg
model_avg.wide <- dcast(model_avg_values, formula = . ~ coef_name, value.var = c("coef_se"))

#add rank of "model avg" to table
model_avg.wide[,Rank := "Model avg"]

best_model_sbt_jaccard_table_formatted <- rbind(model_coef_se_AIC, model_avg.wide, fill = T)

#get rid of interaction coefficients
best_model_sbt_jaccard_table_formatted.r <- best_model_sbt_jaccard_table_formatted[,.(Rank,`(Intercept)`,
                                                                                      area_km.scaledacrossall,
                                depth_annual_avg.scaledacrossall,
                                depth_annual_range.scaledacrossall,
                                haul_id_count_annual.scaledacrossall,
                                latitude_annual_avg.scaledacrossall,
                                latitude_annual_range.scaledacrossall,
                                spp_count_annual.scaledacrossall,
                                summed_tonnes_scaled_byreg,
                                season,
                                survey_unit,
                                yearly_min_bypoint_avg.scaledacrossall,
                                `summed_tonnes_scaled_byreg:survey_unit`,
                                `survey_unit:yearly_min_bypoint_avg.scaledacrossall`,
                                `R squared`,
                                delta,
                                weight
                                )]

#round to 2 significant figures

#names of numeric columns
numeric_cols <- names(best_model_sbt_jaccard_table_formatted.r)[sapply(best_model_sbt_jaccard_table_formatted.r, is.numeric)]

# Apply signif() only to numeric columns
best_model_sbt_jaccard_table_formatted.r[, (numeric_cols) := lapply(.SD, function(x) if (is.numeric(x)) signif(x, digits = 2) else x), .SDcols = numeric_cols]

#change column names, in caption note that all variables are centered and scaled
colnames(best_model_sbt_jaccard_table_formatted.r) <- c(
"Rank",                                              
"Intercept",                                     
"Area",       #scaled across all                    
"Average depth",                  
"Depth range",                
"Number of tows",     
"Average latitude",               
"Latitude range",             
"Species count",                  
"Relative catch", #scaled within region    
"Season",
"Survey",                                       
"Average minimum temperature",            
"Survey * relative catch",            
"Survey * avg min temperature",
"R squared",
paste0("\u0394"," AICc"),                                             
paste0("\u03C9"))



#save as csv

fwrite(best_model_sbt_jaccard_table_formatted.r,here::here("output","best_model_sbt_jaccard_table_formatted.csv"))

###Predict dissimilarity across years using averaged model (model_avg_delta4)

dissimilarity_covariates_dredge.dt_predictions <- copy(dissimilarity_covariates_dredge.dt)

  #allowing temp and fishing to vary (aka no changes)
  dissimilarity_covariates_dredge.dt_predictions[,pred_dissim := predict(model_avg_delta4, se.fit = T, full = F)[[1]]][,pred_se := predict(model_avg_delta4, se.fit = T, full = F)[[2]]] #full allows us to switch back to mixed effect models
Warning: argument 'full' ignoredWarning: argument 'full' ignored
  #What's the R^2 value?
  r.squaredGLMM(lm(data = dissimilarity_covariates_dredge.dt_predictions, annual_dissimilarity_value ~ pred_dissim))
           R2m       R2c
[1,] 0.9445771 0.9445771
  #R2 = 0.9507659
  
  #constant temp in regions (aka take mean of temperature values within survey units so they are the same value within each year for a survey)
  dissimilarity_covariates_dredge.dt_predictions_consistenttempinreg <- copy(dissimilarity_covariates_dredge.dt)
  dissimilarity_covariates_dredge.dt_predictions_consistenttempinreg[,yearly_min_bypoint_avg.scaledacrossall:=mean(yearly_min_bypoint_avg.scaledacrossall),.(survey_unit)]
  dissimilarity_covariates_dredge.dt_predictions_consistenttempinreg[,pred_dissim := predict(model_avg_delta4, se.fit = T, full = F, newdata = dissimilarity_covariates_dredge.dt_predictions_consistenttempinreg)[[1]]][,pred_se := predict(model_avg_delta4, se.fit = T, full = F)[[2]]]
Warning: argument 'full' ignoredWarning: argument 'full' ignored
  
    #What's the R^2 value?
  r.squaredGLMM(lm(data = dissimilarity_covariates_dredge.dt_predictions_consistenttempinreg, annual_dissimilarity_value ~ pred_dissim))
          R2m      R2c
[1,] 0.941983 0.941983
  #R2 = 0.94 (only fishing!!)

  #constant fishing in regions (aka take mean of fishing values within survey units so they are the same value within each year for a survey)
  dissimilarity_covariates_dredge.dt_predictions_consistentfishinginreg <- copy(dissimilarity_covariates_dredge.dt)
  dissimilarity_covariates_dredge.dt_predictions_consistentfishinginreg[,summed_tonnes_scaled_byreg:=mean(summed_tonnes_scaled_byreg),.(survey_unit)]
  
    dissimilarity_covariates_dredge.dt_predictions_consistentfishinginreg[,pred_dissim := predict(model_avg_delta4, se.fit = T, full = F, newdata = dissimilarity_covariates_dredge.dt_predictions_consistentfishinginreg)[[1]]][,pred_se := predict(model_avg_delta4, se.fit = T, full = F)[[2]]]
Warning: argument 'full' ignoredWarning: argument 'full' ignored
  
    #What's the R^2 value?
  r.squaredGLMM(lm(data = dissimilarity_covariates_dredge.dt_predictions_consistentfishinginreg, annual_dissimilarity_value ~ pred_dissim))
           R2m       R2c
[1,] 0.9336986 0.9336986
  #R2 = 0.94 (only temperature!!)

#and then with consistent temp and fishing in regions (aka take mean of both min temp and fishing)
dissimilarity_covariates_dredge.dt_predictions_consistenttempfishinginreg <- copy(dissimilarity_covariates_dredge.dt)
dissimilarity_covariates_dredge.dt_predictions_consistenttempfishinginreg[,summed_tonnes_scaled_byreg:=mean(summed_tonnes_scaled_byreg),.(survey_unit)][,yearly_min_bypoint_avg.scaledacrossall:=mean(yearly_min_bypoint_avg.scaledacrossall),.(survey_unit)]

    dissimilarity_covariates_dredge.dt_predictions_consistenttempfishinginreg[,pred_dissim := predict(model_avg_delta4, se.fit = T, full = F, newdata = dissimilarity_covariates_dredge.dt_predictions_consistenttempfishinginreg)[[1]]][,pred_se := predict(model_avg_delta4, se.fit = T, full = F)[[2]]]
Warning: argument 'full' ignoredWarning: argument 'full' ignored
  
    #What's the R^2 value?
  r.squaredGLMM(lm(data = dissimilarity_covariates_dredge.dt_predictions_consistenttempfishinginreg, annual_dissimilarity_value ~ pred_dissim))
           R2m       R2c
[1,] 0.9314474 0.9314474
  #R2 = 0.93 (only other variables!!! not temp or fishing)


#allowing temp and fishing to vary within regs (normal)
    dissimilarity_covariates_dredge.dt_predictions[,pred_dissim := 
                                                     predict(model_avg_delta4, se.fit = T, full = F, newdata =   dissimilarity_covariates_dredge.dt_predictions)[[1]]][,pred_se := 
                                                                                                                                                                         predict(model_avg_delta4, se.fit = T, full = F, newdata =   dissimilarity_covariates_dredge.dt_predictions)[[2]]]
Warning: argument 'full' ignoredWarning: argument 'full' ignored
  
#allowing only fishing to vary within regions (with mean temp)
  
   dissimilarity_covariates_dredge.dt_predictions_consistenttempinreg[,pred_dissim := 
                                                                        predict(model_avg_delta4, se.fit = T, full = F, newdata = dissimilarity_covariates_dredge.dt_predictions_consistenttempinreg)[[1]]][,pred_se :=
                                                                                                                                                                                                              predict(model_avg_delta4, se.fit = T, full = F, newdata = dissimilarity_covariates_dredge.dt_predictions_consistenttempinreg)[[2]]]
Warning: argument 'full' ignoredWarning: argument 'full' ignored
#FOR COLOR TO MATCH
#sort color link by survey name season
#alphabetical order
color_link_alpha <- setorder(color_link, survey_unit)

#exclude surveys we don't include
color_link_alpha <- color_link_alpha[survey_unit %in% unique(dissimilarity_covariates_dredge.dt_predictions$survey_unit),]

color_alpha_order <- color_link_alpha[,hex]
label_alpha_order <- color_link_alpha[,Survey_Name_Season]
  

#maintain temp and fishing
#plot
predicted_values_temp_fishing <- ggplot(dissimilarity_covariates_dredge.dt_predictions) +
  geom_point(aes(x = year, y = annual_dissimilarity_value, color = survey_unit)) +
  geom_line(aes(x = year, y = pred_dissim, color = survey_unit)) +
  geom_ribbon(aes(x = year, ymin = pred_dissim-pred_se, ymax = pred_dissim+pred_se, fill = survey_unit), alpha = 0.3) +
  scale_color_manual(values = color_alpha_order, labels = label_alpha_order, name = "Survey") +
  scale_fill_manual(values = color_alpha_order, labels = label_alpha_order, name = "Survey") +
  labs(x = "Year",y = "Average annual total\nBray Curtis dissimilarity") +
  ylim(0,1.5) +
  theme_classic() +
  ggtitle("Average model predictions")

#average temp and fishing for each region
predicted_values_temp_fishing_meantempfishinginsurvey <- ggplot(dissimilarity_covariates_dredge.dt_predictions_consistenttempfishinginreg) +
  geom_point(aes(x = year, y = annual_dissimilarity_value, color = survey_unit)) +
  geom_line(aes(x = year, y = pred_dissim, color = survey_unit)) +
  geom_ribbon(aes(x = year, ymin = pred_dissim-pred_se, ymax = pred_dissim+pred_se, fill = survey_unit), alpha = 0.3) +
  scale_color_manual(values = color_alpha_order, labels = label_alpha_order, name = "Survey") +
  scale_fill_manual(values = color_alpha_order, labels = label_alpha_order, name = "Survey") +
  labs(x = "Year",y = "Average annual total\nBray Curtis dissimilarity") +
  ylim(0,1.5) +
  theme_classic() +
  ggtitle("Average model predictions with mean\nsurvey temperature and fishing pressure")

#average temp and fishing across all regions
predicted_values_temp_fishing_meantempfishing <- ggplot(dissimilarity_covariates_dredge.dt_predictions_consistenttempfishing) +
  geom_point(aes(x = year, y = annual_dissimilarity_value, color = survey_unit)) +
  geom_line(aes(x = year, y = pred_dissim, color = survey_unit)) +
  geom_ribbon(aes(x = year, ymin = pred_dissim-pred_se, ymax = pred_dissim+pred_se, fill = survey_unit), alpha = 0.1) +
  scale_color_manual(values = color_alpha_order, labels = label_alpha_order, name = "Survey") +
  scale_fill_manual(values = color_alpha_order, labels = label_alpha_order, name = "Survey") +
  labs(x = "Year",y = "Average annual total\nBray Curtis dissimilarity") +
  ylim(0,1.5) +
  theme_classic() +
  ggtitle("Average model predictions with mean\novereall temperature and fishing pressure")
Error in ggplot(dissimilarity_covariates_dredge.dt_predictions_consistenttempfishing) : 
  object 'dissimilarity_covariates_dredge.dt_predictions_consistenttempfishing' not found

Take dissimilarity values from random normal distribution for each year for each region, and then calculate slope (1000 times). Do this for: - Fishing and temperature vary interannually within surveys - Temperature is held constant (as mean over time series for a survey), but fishing varies (allows us to look at relative variance explained) - Fishing is held constant (as mean over time series for a survey), but temperature varies (allows us to look at relative variance explained) - Both fishing and temperature held constant (allows us to see role of other components of the model)

################################################################################
#full predictions
################################################################################
#table with predicted dissimilarity values and standard error of all predicted dissimilarity values (by year)
table <- dissimilarity_covariates_dredge.dt_predictions[,.(survey_unit, pred_dissim, pred_se, year)]
#0) make datatable to populate
  predicted_dissim_trends_rnormruns <- data.table()
#1) NEW PREDICTED VALUES FROM DISTRIBUTION
for (i in 1:1000){
  table[,rnorm_pred := rnorm(1, mean = pred_dissim, sd = pred_se),.(year, survey_unit)]
#2) CALCULATE LINEAR MODEL TO EXTRACT SURVEY SPECIFIC TREND VALUES
  jaccard_total_predicted_lm_singlerun <- lm(rnorm_pred ~ year*survey_unit,data = table)

  model_coefs_reduced_predictions_singlerun <- data.table(summary(jaccard_total_predicted_lm_singlerun)$coefficients)
  model_coefs_reduced_predictions_singlerun[,var := rownames(summary(jaccard_total_predicted_lm_singlerun)$coefficients)]
  
  #limit to interactions only (check this if there are any model changes!) row 2 and rows 34:64
  model_coefs_reduced_predictions_singlerun <- model_coefs_reduced_predictions_singlerun[c(2,34:64),]
  
  #adjust survey unit name by deleting beginning of string
  model_coefs_reduced_predictions_singlerun[,survey_unit := substr(var, 17, str_length(var))][var == "year",survey_unit := "AI"]
  
  #calculate interaction coefficients
  AI_estimate <- model_coefs_reduced_predictions_singlerun[1,Estimate]
  model_coefs_reduced_predictions_singlerun[1,estimate := AI_estimate]
  model_coefs_reduced_predictions_singlerun[2:32,estimate := (AI_estimate + Estimate)]
  
  predicted_dissim_trends_rnormruns <- rbind(predicted_dissim_trends_rnormruns, model_coefs_reduced_predictions_singlerun[,.(survey_unit, estimate)])
  
  print(i)
}
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
[1] 6
[1] 7
[1] 8
[1] 9
[1] 10
[1] 11
[1] 12
[1] 13
[1] 14
[1] 15
[1] 16
[1] 17
[1] 18
[1] 19
[1] 20
[1] 21
[1] 22
[1] 23
[1] 24
[1] 25
[1] 26
[1] 27
[1] 28
[1] 29
[1] 30
[1] 31
[1] 32
[1] 33
[1] 34
[1] 35
[1] 36
[1] 37
[1] 38
[1] 39
[1] 40
[1] 41
[1] 42
[1] 43
[1] 44
[1] 45
[1] 46
[1] 47
[1] 48
[1] 49
[1] 50
[1] 51
[1] 52
[1] 53
[1] 54
[1] 55
[1] 56
[1] 57
[1] 58
[1] 59
[1] 60
[1] 61
[1] 62
[1] 63
[1] 64
[1] 65
[1] 66
[1] 67
[1] 68
[1] 69
[1] 70
[1] 71
[1] 72
[1] 73
[1] 74
[1] 75
[1] 76
[1] 77
[1] 78
[1] 79
[1] 80
[1] 81
[1] 82
[1] 83
[1] 84
[1] 85
[1] 86
[1] 87
[1] 88
[1] 89
[1] 90
[1] 91
[1] 92
[1] 93
[1] 94
[1] 95
[1] 96
[1] 97
[1] 98
[1] 99
[1] 100
[1] 101
[1] 102
[1] 103
[1] 104
[1] 105
[1] 106
[1] 107
[1] 108
[1] 109
[1] 110
[1] 111
[1] 112
[1] 113
[1] 114
[1] 115
[1] 116
[1] 117
[1] 118
[1] 119
[1] 120
[1] 121
[1] 122
[1] 123
[1] 124
[1] 125
[1] 126
[1] 127
[1] 128
[1] 129
[1] 130
[1] 131
[1] 132
[1] 133
[1] 134
[1] 135
[1] 136
[1] 137
[1] 138
[1] 139
[1] 140
[1] 141
[1] 142
[1] 143
[1] 144
[1] 145
[1] 146
[1] 147
[1] 148
[1] 149
[1] 150
[1] 151
[1] 152
[1] 153
[1] 154
[1] 155
[1] 156
[1] 157
[1] 158
[1] 159
[1] 160
[1] 161
[1] 162
[1] 163
[1] 164
[1] 165
[1] 166
[1] 167
[1] 168
[1] 169
[1] 170
[1] 171
[1] 172
[1] 173
[1] 174
[1] 175
[1] 176
[1] 177
[1] 178
[1] 179
[1] 180
[1] 181
[1] 182
[1] 183
[1] 184
[1] 185
[1] 186
[1] 187
[1] 188
[1] 189
[1] 190
[1] 191
[1] 192
[1] 193
[1] 194
[1] 195
[1] 196
[1] 197
[1] 198
[1] 199
[1] 200
[1] 201
[1] 202
[1] 203
[1] 204
[1] 205
[1] 206
[1] 207
[1] 208
[1] 209
[1] 210
[1] 211
[1] 212
[1] 213
[1] 214
[1] 215
[1] 216
[1] 217
[1] 218
[1] 219
[1] 220
[1] 221
[1] 222
[1] 223
[1] 224
[1] 225
[1] 226
[1] 227
[1] 228
[1] 229
[1] 230
[1] 231
[1] 232
[1] 233
[1] 234
[1] 235
[1] 236
[1] 237
[1] 238
[1] 239
[1] 240
[1] 241
[1] 242
[1] 243
[1] 244
[1] 245
[1] 246
[1] 247
[1] 248
[1] 249
[1] 250
[1] 251
[1] 252
[1] 253
[1] 254
[1] 255
[1] 256
[1] 257
[1] 258
[1] 259
[1] 260
[1] 261
[1] 262
[1] 263
[1] 264
[1] 265
[1] 266
[1] 267
[1] 268
[1] 269
[1] 270
[1] 271
[1] 272
[1] 273
[1] 274
[1] 275
[1] 276
[1] 277
[1] 278
[1] 279
[1] 280
[1] 281
[1] 282
[1] 283
[1] 284
[1] 285
[1] 286
[1] 287
[1] 288
[1] 289
[1] 290
[1] 291
[1] 292
[1] 293
[1] 294
[1] 295
[1] 296
[1] 297
[1] 298
[1] 299
[1] 300
[1] 301
[1] 302
[1] 303
[1] 304
[1] 305
[1] 306
[1] 307
[1] 308
[1] 309
[1] 310
[1] 311
[1] 312
[1] 313
[1] 314
[1] 315
[1] 316
[1] 317
[1] 318
[1] 319
[1] 320
[1] 321
[1] 322
[1] 323
[1] 324
[1] 325
[1] 326
[1] 327
[1] 328
[1] 329
[1] 330
[1] 331
[1] 332
[1] 333
[1] 334
[1] 335
[1] 336
[1] 337
[1] 338
[1] 339
[1] 340
[1] 341
[1] 342
[1] 343
[1] 344
[1] 345
[1] 346
[1] 347
[1] 348
[1] 349
[1] 350
[1] 351
[1] 352
[1] 353
[1] 354
[1] 355
[1] 356
[1] 357
[1] 358
[1] 359
[1] 360
[1] 361
[1] 362
[1] 363
[1] 364
[1] 365
[1] 366
[1] 367
[1] 368
[1] 369
[1] 370
[1] 371
[1] 372
[1] 373
[1] 374
[1] 375
[1] 376
[1] 377
[1] 378
[1] 379
[1] 380
[1] 381
[1] 382
[1] 383
[1] 384
[1] 385
[1] 386
[1] 387
[1] 388
[1] 389
[1] 390
[1] 391
[1] 392
[1] 393
[1] 394
[1] 395
[1] 396
[1] 397
[1] 398
[1] 399
[1] 400
[1] 401
[1] 402
[1] 403
[1] 404
[1] 405
[1] 406
[1] 407
[1] 408
[1] 409
[1] 410
[1] 411
[1] 412
[1] 413
[1] 414
[1] 415
[1] 416
[1] 417
[1] 418
[1] 419
[1] 420
[1] 421
[1] 422
[1] 423
[1] 424
[1] 425
[1] 426
[1] 427
[1] 428
[1] 429
[1] 430
[1] 431
[1] 432
[1] 433
[1] 434
[1] 435
[1] 436
[1] 437
[1] 438
[1] 439
[1] 440
[1] 441
[1] 442
[1] 443
[1] 444
[1] 445
[1] 446
[1] 447
[1] 448
[1] 449
[1] 450
[1] 451
[1] 452
[1] 453
[1] 454
[1] 455
[1] 456
[1] 457
[1] 458
[1] 459
[1] 460
[1] 461
[1] 462
[1] 463
[1] 464
[1] 465
[1] 466
[1] 467
[1] 468
[1] 469
[1] 470
[1] 471
[1] 472
[1] 473
[1] 474
[1] 475
[1] 476
[1] 477
[1] 478
[1] 479
[1] 480
[1] 481
[1] 482
[1] 483
[1] 484
[1] 485
[1] 486
[1] 487
[1] 488
[1] 489
[1] 490
[1] 491
[1] 492
[1] 493
[1] 494
[1] 495
[1] 496
[1] 497
[1] 498
[1] 499
[1] 500
[1] 501
[1] 502
[1] 503
[1] 504
[1] 505
[1] 506
[1] 507
[1] 508
[1] 509
[1] 510
[1] 511
[1] 512
[1] 513
[1] 514
[1] 515
[1] 516
[1] 517
[1] 518
[1] 519
[1] 520
[1] 521
[1] 522
[1] 523
[1] 524
[1] 525
[1] 526
[1] 527
[1] 528
[1] 529
[1] 530
[1] 531
[1] 532
[1] 533
[1] 534
[1] 535
[1] 536
[1] 537
[1] 538
[1] 539
[1] 540
[1] 541
[1] 542
[1] 543
[1] 544
[1] 545
[1] 546
[1] 547
[1] 548
[1] 549
[1] 550
[1] 551
[1] 552
[1] 553
[1] 554
[1] 555
[1] 556
[1] 557
[1] 558
[1] 559
[1] 560
[1] 561
[1] 562
[1] 563
[1] 564
[1] 565
[1] 566
[1] 567
[1] 568
[1] 569
[1] 570
[1] 571
[1] 572
[1] 573
[1] 574
[1] 575
[1] 576
[1] 577
[1] 578
[1] 579
[1] 580
[1] 581
[1] 582
[1] 583
[1] 584
[1] 585
[1] 586
[1] 587
[1] 588
[1] 589
[1] 590
[1] 591
[1] 592
[1] 593
[1] 594
[1] 595
[1] 596
[1] 597
[1] 598
[1] 599
[1] 600
[1] 601
[1] 602
[1] 603
[1] 604
[1] 605
[1] 606
[1] 607
[1] 608
[1] 609
[1] 610
[1] 611
[1] 612
[1] 613
[1] 614
[1] 615
[1] 616
[1] 617
[1] 618
[1] 619
[1] 620
[1] 621
[1] 622
[1] 623
[1] 624
[1] 625
[1] 626
[1] 627
[1] 628
[1] 629
[1] 630
[1] 631
[1] 632
[1] 633
[1] 634
[1] 635
[1] 636
[1] 637
[1] 638
[1] 639
[1] 640
[1] 641
[1] 642
[1] 643
[1] 644
[1] 645
[1] 646
[1] 647
[1] 648
[1] 649
[1] 650
[1] 651
[1] 652
[1] 653
[1] 654
[1] 655
[1] 656
[1] 657
[1] 658
[1] 659
[1] 660
[1] 661
[1] 662
[1] 663
[1] 664
[1] 665
[1] 666
[1] 667
[1] 668
[1] 669
[1] 670
[1] 671
[1] 672
[1] 673
[1] 674
[1] 675
[1] 676
[1] 677
[1] 678
[1] 679
[1] 680
[1] 681
[1] 682
[1] 683
[1] 684
[1] 685
[1] 686
[1] 687
[1] 688
[1] 689
[1] 690
[1] 691
[1] 692
[1] 693
[1] 694
[1] 695
[1] 696
[1] 697
[1] 698
[1] 699
[1] 700
[1] 701
[1] 702
[1] 703
[1] 704
[1] 705
[1] 706
[1] 707
[1] 708
[1] 709
[1] 710
[1] 711
[1] 712
[1] 713
[1] 714
[1] 715
[1] 716
[1] 717
[1] 718
[1] 719
[1] 720
[1] 721
[1] 722
[1] 723
[1] 724
[1] 725
[1] 726
[1] 727
[1] 728
[1] 729
[1] 730
[1] 731
[1] 732
[1] 733
[1] 734
[1] 735
[1] 736
[1] 737
[1] 738
[1] 739
[1] 740
[1] 741
[1] 742
[1] 743
[1] 744
[1] 745
[1] 746
[1] 747
[1] 748
[1] 749
[1] 750
[1] 751
[1] 752
[1] 753
[1] 754
[1] 755
[1] 756
[1] 757
[1] 758
[1] 759
[1] 760
[1] 761
[1] 762
[1] 763
[1] 764
[1] 765
[1] 766
[1] 767
[1] 768
[1] 769
[1] 770
[1] 771
[1] 772
[1] 773
[1] 774
[1] 775
[1] 776
[1] 777
[1] 778
[1] 779
[1] 780
[1] 781
[1] 782
[1] 783
[1] 784
[1] 785
[1] 786
[1] 787
[1] 788
[1] 789
[1] 790
[1] 791
[1] 792
[1] 793
[1] 794
[1] 795
[1] 796
[1] 797
[1] 798
[1] 799
[1] 800
[1] 801
[1] 802
[1] 803
[1] 804
[1] 805
[1] 806
[1] 807
[1] 808
[1] 809
[1] 810
[1] 811
[1] 812
[1] 813
[1] 814
[1] 815
[1] 816
[1] 817
[1] 818
[1] 819
[1] 820
[1] 821
[1] 822
[1] 823
[1] 824
[1] 825
[1] 826
[1] 827
[1] 828
[1] 829
[1] 830
[1] 831
[1] 832
[1] 833
[1] 834
[1] 835
[1] 836
[1] 837
[1] 838
[1] 839
[1] 840
[1] 841
[1] 842
[1] 843
[1] 844
[1] 845
[1] 846
[1] 847
[1] 848
[1] 849
[1] 850
[1] 851
[1] 852
[1] 853
[1] 854
[1] 855
[1] 856
[1] 857
[1] 858
[1] 859
[1] 860
[1] 861
[1] 862
[1] 863
[1] 864
[1] 865
[1] 866
[1] 867
[1] 868
[1] 869
[1] 870
[1] 871
[1] 872
[1] 873
[1] 874
[1] 875
[1] 876
[1] 877
[1] 878
[1] 879
[1] 880
[1] 881
[1] 882
[1] 883
[1] 884
[1] 885
[1] 886
[1] 887
[1] 888
[1] 889
[1] 890
[1] 891
[1] 892
[1] 893
[1] 894
[1] 895
[1] 896
[1] 897
[1] 898
[1] 899
[1] 900
[1] 901
[1] 902
[1] 903
[1] 904
[1] 905
[1] 906
[1] 907
[1] 908
[1] 909
[1] 910
[1] 911
[1] 912
[1] 913
[1] 914
[1] 915
[1] 916
[1] 917
[1] 918
[1] 919
[1] 920
[1] 921
[1] 922
[1] 923
[1] 924
[1] 925
[1] 926
[1] 927
[1] 928
[1] 929
[1] 930
[1] 931
[1] 932
[1] 933
[1] 934
[1] 935
[1] 936
[1] 937
[1] 938
[1] 939
[1] 940
[1] 941
[1] 942
[1] 943
[1] 944
[1] 945
[1] 946
[1] 947
[1] 948
[1] 949
[1] 950
[1] 951
[1] 952
[1] 953
[1] 954
[1] 955
[1] 956
[1] 957
[1] 958
[1] 959
[1] 960
[1] 961
[1] 962
[1] 963
[1] 964
[1] 965
[1] 966
[1] 967
[1] 968
[1] 969
[1] 970
[1] 971
[1] 972
[1] 973
[1] 974
[1] 975
[1] 976
[1] 977
[1] 978
[1] 979
[1] 980
[1] 981
[1] 982
[1] 983
[1] 984
[1] 985
[1] 986
[1] 987
[1] 988
[1] 989
[1] 990
[1] 991
[1] 992
[1] 993
[1] 994
[1] 995
[1] 996
[1] 997
[1] 998
[1] 999
[1] 1000
  
#reduce to mean and standard deviation
predicted_dissim_trends_rnormruns[,mean_dissim_coef:= mean(estimate),survey_unit][,sd_dissim := sd(estimate),.(survey_unit)]

predicted_dissim_trends_rnormruns.summary <- unique(predicted_dissim_trends_rnormruns[,.(survey_unit, mean_dissim_coef, sd_dissim)])

predicted_dissim_trends_rnormruns.summary[,pred_type := "full"]

################################################################################
#predictions with temp held constant and fishing still varying from year to year
################################################################################
#table with predicted dissimilarity values and standard error of all predicted dissimilarity values (by year)
table_constanttemp <- dissimilarity_covariates_dredge.dt_predictions_consistenttempinreg[,.(survey_unit, pred_dissim, pred_se, year)]
#0) make datatable to populate
  predicted_dissim_trends_rnormruns_constanttemp <- data.table()
#1) NEW PREDICTED VALUES FROM DISTRIBUTION
for (i in 1:1000){
  table_constanttemp[,rnorm_pred := rnorm(1, mean = pred_dissim, sd = pred_se),.(year, survey_unit)]
#2) CALCULATE LINEAR MODEL FOR SLOPE VALUES
  jaccard_total_predicted_lm_singlerun_constanttemp <- lm(rnorm_pred ~ year*survey_unit,data = table_constanttemp)

  model_coefs_reduced_predictions_singlerun_constanttemp <- data.table(summary(jaccard_total_predicted_lm_singlerun_constanttemp)$coefficients)
  model_coefs_reduced_predictions_singlerun_constanttemp[,var := rownames(summary(jaccard_total_predicted_lm_singlerun_constanttemp)$coefficients)]
  
  #limit to interactions only (check this if there are any model changes!) row 2 and rows 34:64
  model_coefs_reduced_predictions_singlerun_constanttemp <- model_coefs_reduced_predictions_singlerun_constanttemp[c(2,34:64),]
  
  #adjust survey unit name by deleting beginning of string
  model_coefs_reduced_predictions_singlerun_constanttemp[,survey_unit := substr(var, 17, str_length(var))][var == "year",survey_unit := "AI"]
  
  #calculate interaction coefficients
  AI_estimate <- model_coefs_reduced_predictions_singlerun_constanttemp[1,Estimate]
  model_coefs_reduced_predictions_singlerun_constanttemp[1,estimate := AI_estimate]
  model_coefs_reduced_predictions_singlerun_constanttemp[2:32,estimate := (AI_estimate + Estimate)]
  
  predicted_dissim_trends_rnormruns_constanttemp <- rbind(predicted_dissim_trends_rnormruns_constanttemp, model_coefs_reduced_predictions_singlerun_constanttemp[,.(survey_unit, estimate)])
  
  print(i)
}
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
[1] 6
[1] 7
[1] 8
[1] 9
[1] 10
[1] 11
[1] 12
[1] 13
[1] 14
[1] 15
[1] 16
[1] 17
[1] 18
[1] 19
[1] 20
[1] 21
[1] 22
[1] 23
[1] 24
[1] 25
[1] 26
[1] 27
[1] 28
[1] 29
[1] 30
[1] 31
[1] 32
[1] 33
[1] 34
[1] 35
[1] 36
[1] 37
[1] 38
[1] 39
[1] 40
[1] 41
[1] 42
[1] 43
[1] 44
[1] 45
[1] 46
[1] 47
[1] 48
[1] 49
[1] 50
[1] 51
[1] 52
[1] 53
[1] 54
[1] 55
[1] 56
[1] 57
[1] 58
[1] 59
[1] 60
[1] 61
[1] 62
[1] 63
[1] 64
[1] 65
[1] 66
[1] 67
[1] 68
[1] 69
[1] 70
[1] 71
[1] 72
[1] 73
[1] 74
[1] 75
[1] 76
[1] 77
[1] 78
[1] 79
[1] 80
[1] 81
[1] 82
[1] 83
[1] 84
[1] 85
[1] 86
[1] 87
[1] 88
[1] 89
[1] 90
[1] 91
[1] 92
[1] 93
[1] 94
[1] 95
[1] 96
[1] 97
[1] 98
[1] 99
[1] 100
[1] 101
[1] 102
[1] 103
[1] 104
[1] 105
[1] 106
[1] 107
[1] 108
[1] 109
[1] 110
[1] 111
[1] 112
[1] 113
[1] 114
[1] 115
[1] 116
[1] 117
[1] 118
[1] 119
[1] 120
[1] 121
[1] 122
[1] 123
[1] 124
[1] 125
[1] 126
[1] 127
[1] 128
[1] 129
[1] 130
[1] 131
[1] 132
[1] 133
[1] 134
[1] 135
[1] 136
[1] 137
[1] 138
[1] 139
[1] 140
[1] 141
[1] 142
[1] 143
[1] 144
[1] 145
[1] 146
[1] 147
[1] 148
[1] 149
[1] 150
[1] 151
[1] 152
[1] 153
[1] 154
[1] 155
[1] 156
[1] 157
[1] 158
[1] 159
[1] 160
[1] 161
[1] 162
[1] 163
[1] 164
[1] 165
[1] 166
[1] 167
[1] 168
[1] 169
[1] 170
[1] 171
[1] 172
[1] 173
[1] 174
[1] 175
[1] 176
[1] 177
[1] 178
[1] 179
[1] 180
[1] 181
[1] 182
[1] 183
[1] 184
[1] 185
[1] 186
[1] 187
[1] 188
[1] 189
[1] 190
[1] 191
[1] 192
[1] 193
[1] 194
[1] 195
[1] 196
[1] 197
[1] 198
[1] 199
[1] 200
[1] 201
[1] 202
[1] 203
[1] 204
[1] 205
[1] 206
[1] 207
[1] 208
[1] 209
[1] 210
[1] 211
[1] 212
[1] 213
[1] 214
[1] 215
[1] 216
[1] 217
[1] 218
[1] 219
[1] 220
[1] 221
[1] 222
[1] 223
[1] 224
[1] 225
[1] 226
[1] 227
[1] 228
[1] 229
[1] 230
[1] 231
[1] 232
[1] 233
[1] 234
[1] 235
[1] 236
[1] 237
[1] 238
[1] 239
[1] 240
[1] 241
[1] 242
[1] 243
[1] 244
[1] 245
[1] 246
[1] 247
[1] 248
[1] 249
[1] 250
[1] 251
[1] 252
[1] 253
[1] 254
[1] 255
[1] 256
[1] 257
[1] 258
[1] 259
[1] 260
[1] 261
[1] 262
[1] 263
[1] 264
[1] 265
[1] 266
[1] 267
[1] 268
[1] 269
[1] 270
[1] 271
[1] 272
[1] 273
[1] 274
[1] 275
[1] 276
[1] 277
[1] 278
[1] 279
[1] 280
[1] 281
[1] 282
[1] 283
[1] 284
[1] 285
[1] 286
[1] 287
[1] 288
[1] 289
[1] 290
[1] 291
[1] 292
[1] 293
[1] 294
[1] 295
[1] 296
[1] 297
[1] 298
[1] 299
[1] 300
[1] 301
[1] 302
[1] 303
[1] 304
[1] 305
[1] 306
[1] 307
[1] 308
[1] 309
[1] 310
[1] 311
[1] 312
[1] 313
[1] 314
[1] 315
[1] 316
[1] 317
[1] 318
[1] 319
[1] 320
[1] 321
[1] 322
[1] 323
[1] 324
[1] 325
[1] 326
[1] 327
[1] 328
[1] 329
[1] 330
[1] 331
[1] 332
[1] 333
[1] 334
[1] 335
[1] 336
[1] 337
[1] 338
[1] 339
[1] 340
[1] 341
[1] 342
[1] 343
[1] 344
[1] 345
[1] 346
[1] 347
[1] 348
[1] 349
[1] 350
[1] 351
[1] 352
[1] 353
[1] 354
[1] 355
[1] 356
[1] 357
[1] 358
[1] 359
[1] 360
[1] 361
[1] 362
[1] 363
[1] 364
[1] 365
[1] 366
[1] 367
[1] 368
[1] 369
[1] 370
[1] 371
[1] 372
[1] 373
[1] 374
[1] 375
[1] 376
[1] 377
[1] 378
[1] 379
[1] 380
[1] 381
[1] 382
[1] 383
[1] 384
[1] 385
[1] 386
[1] 387
[1] 388
[1] 389
[1] 390
[1] 391
[1] 392
[1] 393
[1] 394
[1] 395
[1] 396
[1] 397
[1] 398
[1] 399
[1] 400
[1] 401
[1] 402
[1] 403
[1] 404
[1] 405
[1] 406
[1] 407
[1] 408
[1] 409
[1] 410
[1] 411
[1] 412
[1] 413
[1] 414
[1] 415
[1] 416
[1] 417
[1] 418
[1] 419
[1] 420
[1] 421
[1] 422
[1] 423
[1] 424
[1] 425
[1] 426
[1] 427
[1] 428
[1] 429
[1] 430
[1] 431
[1] 432
[1] 433
[1] 434
[1] 435
[1] 436
[1] 437
[1] 438
[1] 439
[1] 440
[1] 441
[1] 442
[1] 443
[1] 444
[1] 445
[1] 446
[1] 447
[1] 448
[1] 449
[1] 450
[1] 451
[1] 452
[1] 453
[1] 454
[1] 455
[1] 456
[1] 457
[1] 458
[1] 459
[1] 460
[1] 461
[1] 462
[1] 463
[1] 464
[1] 465
[1] 466
[1] 467
[1] 468
[1] 469
[1] 470
[1] 471
[1] 472
[1] 473
[1] 474
[1] 475
[1] 476
[1] 477
[1] 478
[1] 479
[1] 480
[1] 481
[1] 482
[1] 483
[1] 484
[1] 485
[1] 486
[1] 487
[1] 488
[1] 489
[1] 490
[1] 491
[1] 492
[1] 493
[1] 494
[1] 495
[1] 496
[1] 497
[1] 498
[1] 499
[1] 500
[1] 501
[1] 502
[1] 503
[1] 504
[1] 505
[1] 506
[1] 507
[1] 508
[1] 509
[1] 510
[1] 511
[1] 512
[1] 513
[1] 514
[1] 515
[1] 516
[1] 517
[1] 518
[1] 519
[1] 520
[1] 521
[1] 522
[1] 523
[1] 524
[1] 525
[1] 526
[1] 527
[1] 528
[1] 529
[1] 530
[1] 531
[1] 532
[1] 533
[1] 534
[1] 535
[1] 536
[1] 537
[1] 538
[1] 539
[1] 540
[1] 541
[1] 542
[1] 543
[1] 544
[1] 545
[1] 546
[1] 547
[1] 548
[1] 549
[1] 550
[1] 551
[1] 552
[1] 553
[1] 554
[1] 555
[1] 556
[1] 557
[1] 558
[1] 559
[1] 560
[1] 561
[1] 562
[1] 563
[1] 564
[1] 565
[1] 566
[1] 567
[1] 568
[1] 569
[1] 570
[1] 571
[1] 572
[1] 573
[1] 574
[1] 575
[1] 576
[1] 577
[1] 578
[1] 579
[1] 580
[1] 581
[1] 582
[1] 583
[1] 584
[1] 585
[1] 586
[1] 587
[1] 588
[1] 589
[1] 590
[1] 591
[1] 592
[1] 593
[1] 594
[1] 595
[1] 596
[1] 597
[1] 598
[1] 599
[1] 600
[1] 601
[1] 602
[1] 603
[1] 604
[1] 605
[1] 606
[1] 607
[1] 608
[1] 609
[1] 610
[1] 611
[1] 612
[1] 613
[1] 614
[1] 615
[1] 616
[1] 617
[1] 618
[1] 619
[1] 620
[1] 621
[1] 622
[1] 623
[1] 624
[1] 625
[1] 626
[1] 627
[1] 628
[1] 629
[1] 630
[1] 631
[1] 632
[1] 633
[1] 634
[1] 635
[1] 636
[1] 637
[1] 638
[1] 639
[1] 640
[1] 641
[1] 642
[1] 643
[1] 644
[1] 645
[1] 646
[1] 647
[1] 648
[1] 649
[1] 650
[1] 651
[1] 652
[1] 653
[1] 654
[1] 655
[1] 656
[1] 657
[1] 658
[1] 659
[1] 660
[1] 661
[1] 662
[1] 663
[1] 664
[1] 665
[1] 666
[1] 667
[1] 668
[1] 669
[1] 670
[1] 671
[1] 672
[1] 673
[1] 674
[1] 675
[1] 676
[1] 677
[1] 678
[1] 679
[1] 680
[1] 681
[1] 682
[1] 683
[1] 684
[1] 685
[1] 686
[1] 687
[1] 688
[1] 689
[1] 690
[1] 691
[1] 692
[1] 693
[1] 694
[1] 695
[1] 696
[1] 697
[1] 698
[1] 699
[1] 700
[1] 701
[1] 702
[1] 703
[1] 704
[1] 705
[1] 706
[1] 707
[1] 708
[1] 709
[1] 710
[1] 711
[1] 712
[1] 713
[1] 714
[1] 715
[1] 716
[1] 717
[1] 718
[1] 719
[1] 720
[1] 721
[1] 722
[1] 723
[1] 724
[1] 725
[1] 726
[1] 727
[1] 728
[1] 729
[1] 730
[1] 731
[1] 732
[1] 733
[1] 734
[1] 735
[1] 736
[1] 737
[1] 738
[1] 739
[1] 740
[1] 741
[1] 742
[1] 743
[1] 744
[1] 745
[1] 746
[1] 747
[1] 748
[1] 749
[1] 750
[1] 751
[1] 752
[1] 753
[1] 754
[1] 755
[1] 756
[1] 757
[1] 758
[1] 759
[1] 760
[1] 761
[1] 762
[1] 763
[1] 764
[1] 765
[1] 766
[1] 767
[1] 768
[1] 769
[1] 770
[1] 771
[1] 772
[1] 773
[1] 774
[1] 775
[1] 776
[1] 777
[1] 778
[1] 779
[1] 780
[1] 781
[1] 782
[1] 783
[1] 784
[1] 785
[1] 786
[1] 787
[1] 788
[1] 789
[1] 790
[1] 791
[1] 792
[1] 793
[1] 794
[1] 795
[1] 796
[1] 797
[1] 798
[1] 799
[1] 800
[1] 801
[1] 802
[1] 803
[1] 804
[1] 805
[1] 806
[1] 807
[1] 808
[1] 809
[1] 810
[1] 811
[1] 812
[1] 813
[1] 814
[1] 815
[1] 816
[1] 817
[1] 818
[1] 819
[1] 820
[1] 821
[1] 822
[1] 823
[1] 824
[1] 825
[1] 826
[1] 827
[1] 828
[1] 829
[1] 830
[1] 831
[1] 832
[1] 833
[1] 834
[1] 835
[1] 836
[1] 837
[1] 838
[1] 839
[1] 840
[1] 841
[1] 842
[1] 843
[1] 844
[1] 845
[1] 846
[1] 847
[1] 848
[1] 849
[1] 850
[1] 851
[1] 852
[1] 853
[1] 854
[1] 855
[1] 856
[1] 857
[1] 858
[1] 859
[1] 860
[1] 861
[1] 862
[1] 863
[1] 864
[1] 865
[1] 866
[1] 867
[1] 868
[1] 869
[1] 870
[1] 871
[1] 872
[1] 873
[1] 874
[1] 875
[1] 876
[1] 877
[1] 878
[1] 879
[1] 880
[1] 881
[1] 882
[1] 883
[1] 884
[1] 885
[1] 886
[1] 887
[1] 888
[1] 889
[1] 890
[1] 891
[1] 892
[1] 893
[1] 894
[1] 895
[1] 896
[1] 897
[1] 898
[1] 899
[1] 900
[1] 901
[1] 902
[1] 903
[1] 904
[1] 905
[1] 906
[1] 907
[1] 908
[1] 909
[1] 910
[1] 911
[1] 912
[1] 913
[1] 914
[1] 915
[1] 916
[1] 917
[1] 918
[1] 919
[1] 920
[1] 921
[1] 922
[1] 923
[1] 924
[1] 925
[1] 926
[1] 927
[1] 928
[1] 929
[1] 930
[1] 931
[1] 932
[1] 933
[1] 934
[1] 935
[1] 936
[1] 937
[1] 938
[1] 939
[1] 940
[1] 941
[1] 942
[1] 943
[1] 944
[1] 945
[1] 946
[1] 947
[1] 948
[1] 949
[1] 950
[1] 951
[1] 952
[1] 953
[1] 954
[1] 955
[1] 956
[1] 957
[1] 958
[1] 959
[1] 960
[1] 961
[1] 962
[1] 963
[1] 964
[1] 965
[1] 966
[1] 967
[1] 968
[1] 969
[1] 970
[1] 971
[1] 972
[1] 973
[1] 974
[1] 975
[1] 976
[1] 977
[1] 978
[1] 979
[1] 980
[1] 981
[1] 982
[1] 983
[1] 984
[1] 985
[1] 986
[1] 987
[1] 988
[1] 989
[1] 990
[1] 991
[1] 992
[1] 993
[1] 994
[1] 995
[1] 996
[1] 997
[1] 998
[1] 999
[1] 1000
  
#reduce to mean and standard deviation
predicted_dissim_trends_rnormruns_constanttemp[,mean_dissim_coef:= mean(estimate),survey_unit][,sd_dissim := sd(estimate),.(survey_unit)]

predicted_dissim_trends_rnormrunsconstant_temp.summary <- unique(predicted_dissim_trends_rnormruns_constanttemp[,.(survey_unit, mean_dissim_coef, sd_dissim)])

predicted_dissim_trends_rnormrunsconstant_temp.summary[,pred_type := "temp_constant"]

predicted_dissim_trends_rnormruns.summary <- rbind(predicted_dissim_trends_rnormruns.summary, predicted_dissim_trends_rnormrunsconstant_temp.summary)

################################################################################
#predictions with fishing held constant (and temperature varying)
################################################################################
#table with predicted dissimilarity values and standard error of all predicted dissimilarity values (by year)
table_constantfishing <- dissimilarity_covariates_dredge.dt_predictions_consistentfishinginreg[,.(survey_unit, pred_dissim, pred_se, year)]
#0) make datatable to populate
  predicted_dissim_trends_rnormruns_constantfishing <- data.table()
#1) NEW PREDICTED VALUES FROM DISTRIBUTION
for (i in 1:1000){
  table_constantfishing[,rnorm_pred := rnorm(1, mean = pred_dissim, sd = pred_se),.(year, survey_unit)]
#2) CALCULATE LINEAR MODEL FOR SLOPE VALUES
  jaccard_total_predicted_lm_singlerun_constantfishing <- lm(rnorm_pred ~ year*survey_unit,data = table_constantfishing)

  model_coefs_reduced_predictions_singlerun_constantfishing <- data.table(summary(jaccard_total_predicted_lm_singlerun_constantfishing)$coefficients)
  model_coefs_reduced_predictions_singlerun_constantfishing[,var := rownames(summary(jaccard_total_predicted_lm_singlerun_constantfishing)$coefficients)]
  
  #limit to interactions only (check this if there are any model changes!) row 2 and rows 34:64
  model_coefs_reduced_predictions_singlerun_constantfishing <- model_coefs_reduced_predictions_singlerun_constantfishing[c(2,34:64),]
  
  #adjust survey unit name by deleting beginning of string
  model_coefs_reduced_predictions_singlerun_constantfishing[,survey_unit := substr(var, 17, str_length(var))][var == "year",survey_unit := "AI"]
  
  #calculate interaction coefficients
  AI_estimate <- model_coefs_reduced_predictions_singlerun_constantfishing[1,Estimate]
  model_coefs_reduced_predictions_singlerun_constantfishing[1,estimate := AI_estimate]
  model_coefs_reduced_predictions_singlerun_constantfishing[2:32,estimate := (AI_estimate + Estimate)]
  
  predicted_dissim_trends_rnormruns_constantfishing <- rbind(predicted_dissim_trends_rnormruns_constantfishing, model_coefs_reduced_predictions_singlerun_constantfishing[,.(survey_unit, estimate)])
  
  print(i)
}
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
[1] 6
[1] 7
[1] 8
[1] 9
[1] 10
[1] 11
[1] 12
[1] 13
[1] 14
[1] 15
[1] 16
[1] 17
[1] 18
[1] 19
[1] 20
[1] 21
[1] 22
[1] 23
[1] 24
[1] 25
[1] 26
[1] 27
[1] 28
[1] 29
[1] 30
[1] 31
[1] 32
[1] 33
[1] 34
[1] 35
[1] 36
[1] 37
[1] 38
[1] 39
[1] 40
[1] 41
[1] 42
[1] 43
[1] 44
[1] 45
[1] 46
[1] 47
[1] 48
[1] 49
[1] 50
[1] 51
[1] 52
[1] 53
[1] 54
[1] 55
[1] 56
[1] 57
[1] 58
[1] 59
[1] 60
[1] 61
[1] 62
[1] 63
[1] 64
[1] 65
[1] 66
[1] 67
[1] 68
[1] 69
[1] 70
[1] 71
[1] 72
[1] 73
[1] 74
[1] 75
[1] 76
[1] 77
[1] 78
[1] 79
[1] 80
[1] 81
[1] 82
[1] 83
[1] 84
[1] 85
[1] 86
[1] 87
[1] 88
[1] 89
[1] 90
[1] 91
[1] 92
[1] 93
[1] 94
[1] 95
[1] 96
[1] 97
[1] 98
[1] 99
[1] 100
[1] 101
[1] 102
[1] 103
[1] 104
[1] 105
[1] 106
[1] 107
[1] 108
[1] 109
[1] 110
[1] 111
[1] 112
[1] 113
[1] 114
[1] 115
[1] 116
[1] 117
[1] 118
[1] 119
[1] 120
[1] 121
[1] 122
[1] 123
[1] 124
[1] 125
[1] 126
[1] 127
[1] 128
[1] 129
[1] 130
[1] 131
[1] 132
[1] 133
[1] 134
[1] 135
[1] 136
[1] 137
[1] 138
[1] 139
[1] 140
[1] 141
[1] 142
[1] 143
[1] 144
[1] 145
[1] 146
[1] 147
[1] 148
[1] 149
[1] 150
[1] 151
[1] 152
[1] 153
[1] 154
[1] 155
[1] 156
[1] 157
[1] 158
[1] 159
[1] 160
[1] 161
[1] 162
[1] 163
[1] 164
[1] 165
[1] 166
[1] 167
[1] 168
[1] 169
[1] 170
[1] 171
[1] 172
[1] 173
[1] 174
[1] 175
[1] 176
[1] 177
[1] 178
[1] 179
[1] 180
[1] 181
[1] 182
[1] 183
[1] 184
[1] 185
[1] 186
[1] 187
[1] 188
[1] 189
[1] 190
[1] 191
[1] 192
[1] 193
[1] 194
[1] 195
[1] 196
[1] 197
[1] 198
[1] 199
[1] 200
[1] 201
[1] 202
[1] 203
[1] 204
[1] 205
[1] 206
[1] 207
[1] 208
[1] 209
[1] 210
[1] 211
[1] 212
[1] 213
[1] 214
[1] 215
[1] 216
[1] 217
[1] 218
[1] 219
[1] 220
[1] 221
[1] 222
[1] 223
[1] 224
[1] 225
[1] 226
[1] 227
[1] 228
[1] 229
[1] 230
[1] 231
[1] 232
[1] 233
[1] 234
[1] 235
[1] 236
[1] 237
[1] 238
[1] 239
[1] 240
[1] 241
[1] 242
[1] 243
[1] 244
[1] 245
[1] 246
[1] 247
[1] 248
[1] 249
[1] 250
[1] 251
[1] 252
[1] 253
[1] 254
[1] 255
[1] 256
[1] 257
[1] 258
[1] 259
[1] 260
[1] 261
[1] 262
[1] 263
[1] 264
[1] 265
[1] 266
[1] 267
[1] 268
[1] 269
[1] 270
[1] 271
[1] 272
[1] 273
[1] 274
[1] 275
[1] 276
[1] 277
[1] 278
[1] 279
[1] 280
[1] 281
[1] 282
[1] 283
[1] 284
[1] 285
[1] 286
[1] 287
[1] 288
[1] 289
[1] 290
[1] 291
[1] 292
[1] 293
[1] 294
[1] 295
[1] 296
[1] 297
[1] 298
[1] 299
[1] 300
[1] 301
[1] 302
[1] 303
[1] 304
[1] 305
[1] 306
[1] 307
[1] 308
[1] 309
[1] 310
[1] 311
[1] 312
[1] 313
[1] 314
[1] 315
[1] 316
[1] 317
[1] 318
[1] 319
[1] 320
[1] 321
[1] 322
[1] 323
[1] 324
[1] 325
[1] 326
[1] 327
[1] 328
[1] 329
[1] 330
[1] 331
[1] 332
[1] 333
[1] 334
[1] 335
[1] 336
[1] 337
[1] 338
[1] 339
[1] 340
[1] 341
[1] 342
[1] 343
[1] 344
[1] 345
[1] 346
[1] 347
[1] 348
[1] 349
[1] 350
[1] 351
[1] 352
[1] 353
[1] 354
[1] 355
[1] 356
[1] 357
[1] 358
[1] 359
[1] 360
[1] 361
[1] 362
[1] 363
[1] 364
[1] 365
[1] 366
[1] 367
[1] 368
[1] 369
[1] 370
[1] 371
[1] 372
[1] 373
[1] 374
[1] 375
[1] 376
[1] 377
[1] 378
[1] 379
[1] 380
[1] 381
[1] 382
[1] 383
[1] 384
[1] 385
[1] 386
[1] 387
[1] 388
[1] 389
[1] 390
[1] 391
[1] 392
[1] 393
[1] 394
[1] 395
[1] 396
[1] 397
[1] 398
[1] 399
[1] 400
[1] 401
[1] 402
[1] 403
[1] 404
[1] 405
[1] 406
[1] 407
[1] 408
[1] 409
[1] 410
[1] 411
[1] 412
[1] 413
[1] 414
[1] 415
[1] 416
[1] 417
[1] 418
[1] 419
[1] 420
[1] 421
[1] 422
[1] 423
[1] 424
[1] 425
[1] 426
[1] 427
[1] 428
[1] 429
[1] 430
[1] 431
[1] 432
[1] 433
[1] 434
[1] 435
[1] 436
[1] 437
[1] 438
[1] 439
[1] 440
[1] 441
[1] 442
[1] 443
[1] 444
[1] 445
[1] 446
[1] 447
[1] 448
[1] 449
[1] 450
[1] 451
[1] 452
[1] 453
[1] 454
[1] 455
[1] 456
[1] 457
[1] 458
[1] 459
[1] 460
[1] 461
[1] 462
[1] 463
[1] 464
[1] 465
[1] 466
[1] 467
[1] 468
[1] 469
[1] 470
[1] 471
[1] 472
[1] 473
[1] 474
[1] 475
[1] 476
[1] 477
[1] 478
[1] 479
[1] 480
[1] 481
[1] 482
[1] 483
[1] 484
[1] 485
[1] 486
[1] 487
[1] 488
[1] 489
[1] 490
[1] 491
[1] 492
[1] 493
[1] 494
[1] 495
[1] 496
[1] 497
[1] 498
[1] 499
[1] 500
[1] 501
[1] 502
[1] 503
[1] 504
[1] 505
[1] 506
[1] 507
[1] 508
[1] 509
[1] 510
[1] 511
[1] 512
[1] 513
[1] 514
[1] 515
[1] 516
[1] 517
[1] 518
[1] 519
[1] 520
[1] 521
[1] 522
[1] 523
[1] 524
[1] 525
[1] 526
[1] 527
[1] 528
[1] 529
[1] 530
[1] 531
[1] 532
[1] 533
[1] 534
[1] 535
[1] 536
[1] 537
[1] 538
[1] 539
[1] 540
[1] 541
[1] 542
[1] 543
[1] 544
[1] 545
[1] 546
[1] 547
[1] 548
[1] 549
[1] 550
[1] 551
[1] 552
[1] 553
[1] 554
[1] 555
[1] 556
[1] 557
[1] 558
[1] 559
[1] 560
[1] 561
[1] 562
[1] 563
[1] 564
[1] 565
[1] 566
[1] 567
[1] 568
[1] 569
[1] 570
[1] 571
[1] 572
[1] 573
[1] 574
[1] 575
[1] 576
[1] 577
[1] 578
[1] 579
[1] 580
[1] 581
[1] 582
[1] 583
[1] 584
[1] 585
[1] 586
[1] 587
[1] 588
[1] 589
[1] 590
[1] 591
[1] 592
[1] 593
[1] 594
[1] 595
[1] 596
[1] 597
[1] 598
[1] 599
[1] 600
[1] 601
[1] 602
[1] 603
[1] 604
[1] 605
[1] 606
[1] 607
[1] 608
[1] 609
[1] 610
[1] 611
[1] 612
[1] 613
[1] 614
[1] 615
[1] 616
[1] 617
[1] 618
[1] 619
[1] 620
[1] 621
[1] 622
[1] 623
[1] 624
[1] 625
[1] 626
[1] 627
[1] 628
[1] 629
[1] 630
[1] 631
[1] 632
[1] 633
[1] 634
[1] 635
[1] 636
[1] 637
[1] 638
[1] 639
[1] 640
[1] 641
[1] 642
[1] 643
[1] 644
[1] 645
[1] 646
[1] 647
[1] 648
[1] 649
[1] 650
[1] 651
[1] 652
[1] 653
[1] 654
[1] 655
[1] 656
[1] 657
[1] 658
[1] 659
[1] 660
[1] 661
[1] 662
[1] 663
[1] 664
[1] 665
[1] 666
[1] 667
[1] 668
[1] 669
[1] 670
[1] 671
[1] 672
[1] 673
[1] 674
[1] 675
[1] 676
[1] 677
[1] 678
[1] 679
[1] 680
[1] 681
[1] 682
[1] 683
[1] 684
[1] 685
[1] 686
[1] 687
[1] 688
[1] 689
[1] 690
[1] 691
[1] 692
[1] 693
[1] 694
[1] 695
[1] 696
[1] 697
[1] 698
[1] 699
[1] 700
[1] 701
[1] 702
[1] 703
[1] 704
[1] 705
[1] 706
[1] 707
[1] 708
[1] 709
[1] 710
[1] 711
[1] 712
[1] 713
[1] 714
[1] 715
[1] 716
[1] 717
[1] 718
[1] 719
[1] 720
[1] 721
[1] 722
[1] 723
[1] 724
[1] 725
[1] 726
[1] 727
[1] 728
[1] 729
[1] 730
[1] 731
[1] 732
[1] 733
[1] 734
[1] 735
[1] 736
[1] 737
[1] 738
[1] 739
[1] 740
[1] 741
[1] 742
[1] 743
[1] 744
[1] 745
[1] 746
[1] 747
[1] 748
[1] 749
[1] 750
[1] 751
[1] 752
[1] 753
[1] 754
[1] 755
[1] 756
[1] 757
[1] 758
[1] 759
[1] 760
[1] 761
[1] 762
[1] 763
[1] 764
[1] 765
[1] 766
[1] 767
[1] 768
[1] 769
[1] 770
[1] 771
[1] 772
[1] 773
[1] 774
[1] 775
[1] 776
[1] 777
[1] 778
[1] 779
[1] 780
[1] 781
[1] 782
[1] 783
[1] 784
[1] 785
[1] 786
[1] 787
[1] 788
[1] 789
[1] 790
[1] 791
[1] 792
[1] 793
[1] 794
[1] 795
[1] 796
[1] 797
[1] 798
[1] 799
[1] 800
[1] 801
[1] 802
[1] 803
[1] 804
[1] 805
[1] 806
[1] 807
[1] 808
[1] 809
[1] 810
[1] 811
[1] 812
[1] 813
[1] 814
[1] 815
[1] 816
[1] 817
[1] 818
[1] 819
[1] 820
[1] 821
[1] 822
[1] 823
[1] 824
[1] 825
[1] 826
[1] 827
[1] 828
[1] 829
[1] 830
[1] 831
[1] 832
[1] 833
[1] 834
[1] 835
[1] 836
[1] 837
[1] 838
[1] 839
[1] 840
[1] 841
[1] 842
[1] 843
[1] 844
[1] 845
[1] 846
[1] 847
[1] 848
[1] 849
[1] 850
[1] 851
[1] 852
[1] 853
[1] 854
[1] 855
[1] 856
[1] 857
[1] 858
[1] 859
[1] 860
[1] 861
[1] 862
[1] 863
[1] 864
[1] 865
[1] 866
[1] 867
[1] 868
[1] 869
[1] 870
[1] 871
[1] 872
[1] 873
[1] 874
[1] 875
[1] 876
[1] 877
[1] 878
[1] 879
[1] 880
[1] 881
[1] 882
[1] 883
[1] 884
[1] 885
[1] 886
[1] 887
[1] 888
[1] 889
[1] 890
[1] 891
[1] 892
[1] 893
[1] 894
[1] 895
[1] 896
[1] 897
[1] 898
[1] 899
[1] 900
[1] 901
[1] 902
[1] 903
[1] 904
[1] 905
[1] 906
[1] 907
[1] 908
[1] 909
[1] 910
[1] 911
[1] 912
[1] 913
[1] 914
[1] 915
[1] 916
[1] 917
[1] 918
[1] 919
[1] 920
[1] 921
[1] 922
[1] 923
[1] 924
[1] 925
[1] 926
[1] 927
[1] 928
[1] 929
[1] 930
[1] 931
[1] 932
[1] 933
[1] 934
[1] 935
[1] 936
[1] 937
[1] 938
[1] 939
[1] 940
[1] 941
[1] 942
[1] 943
[1] 944
[1] 945
[1] 946
[1] 947
[1] 948
[1] 949
[1] 950
[1] 951
[1] 952
[1] 953
[1] 954
[1] 955
[1] 956
[1] 957
[1] 958
[1] 959
[1] 960
[1] 961
[1] 962
[1] 963
[1] 964
[1] 965
[1] 966
[1] 967
[1] 968
[1] 969
[1] 970
[1] 971
[1] 972
[1] 973
[1] 974
[1] 975
[1] 976
[1] 977
[1] 978
[1] 979
[1] 980
[1] 981
[1] 982
[1] 983
[1] 984
[1] 985
[1] 986
[1] 987
[1] 988
[1] 989
[1] 990
[1] 991
[1] 992
[1] 993
[1] 994
[1] 995
[1] 996
[1] 997
[1] 998
[1] 999
[1] 1000
  
#reduce to mean and standard deviation
predicted_dissim_trends_rnormruns_constantfishing[,mean_dissim_coef:= mean(estimate),survey_unit][,sd_dissim := sd(estimate),.(survey_unit)]

predicted_dissim_trends_rnormrunsconstant_fishing.summary <- unique(predicted_dissim_trends_rnormruns_constantfishing[,.(survey_unit, mean_dissim_coef, sd_dissim)])

predicted_dissim_trends_rnormrunsconstant_fishing.summary[,pred_type := "fishing_constant"]

predicted_dissim_trends_rnormruns.summary <- rbind(predicted_dissim_trends_rnormruns.summary, predicted_dissim_trends_rnormrunsconstant_fishing.summary)


################################################################################
#predictions with both fishing and temperature held constant (variability goes to other factors we don't account for)
################################################################################
#table with predicted dissimilarity values and standard error of all predicted dissimilarity values (by year)
table_constanttempfishing <- dissimilarity_covariates_dredge.dt_predictions_consistenttempfishinginreg[,.(survey_unit, pred_dissim, pred_se, year)]
#0) make datatable to populate
  predicted_dissim_trends_rnormruns_constanttempfishing <- data.table()
#1) NEW PREDICTED VALUES FROM DISTRIBUTION
for (i in 1:1000){
  table_constanttempfishing[,rnorm_pred := rnorm(1, mean = pred_dissim, sd = pred_se),.(year, survey_unit)]
#2) CALCULATE LINEAR MODEL FOR SLOPE VALUES
  jaccard_total_predicted_lm_singlerun_constanttempfishing <- lm(rnorm_pred ~ year*survey_unit,data = table_constanttempfishing)

  model_coefs_reduced_predictions_singlerun_constanttempfishing <- data.table(summary(jaccard_total_predicted_lm_singlerun_constanttempfishing)$coefficients)
  model_coefs_reduced_predictions_singlerun_constanttempfishing[,var := rownames(summary(jaccard_total_predicted_lm_singlerun_constanttempfishing)$coefficients)]
  
  #limit to interactions only (check this if there are any model changes!) row 2 and rows 34:64
  model_coefs_reduced_predictions_singlerun_constanttempfishing <- model_coefs_reduced_predictions_singlerun_constanttempfishing[c(2,34:64),]
  
  #adjust survey unit name by deleting beginning of string
  model_coefs_reduced_predictions_singlerun_constanttempfishing[,survey_unit := substr(var, 17, str_length(var))][var == "year",survey_unit := "AI"]
  
  #calculate interaction coefficients
  AI_estimate <- model_coefs_reduced_predictions_singlerun_constanttempfishing[1,Estimate]
  model_coefs_reduced_predictions_singlerun_constanttempfishing[1,estimate := AI_estimate]
  model_coefs_reduced_predictions_singlerun_constanttempfishing[2:32,estimate := (AI_estimate + Estimate)]
  
  predicted_dissim_trends_rnormruns_constanttempfishing <- rbind(predicted_dissim_trends_rnormruns_constanttempfishing, model_coefs_reduced_predictions_singlerun_constanttempfishing[,.(survey_unit, estimate)])
  
  print(i)
}
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
[1] 6
[1] 7
[1] 8
[1] 9
[1] 10
[1] 11
[1] 12
[1] 13
[1] 14
[1] 15
[1] 16
[1] 17
[1] 18
[1] 19
[1] 20
[1] 21
[1] 22
[1] 23
[1] 24
[1] 25
[1] 26
[1] 27
[1] 28
[1] 29
[1] 30
[1] 31
[1] 32
[1] 33
[1] 34
[1] 35
[1] 36
[1] 37
[1] 38
[1] 39
[1] 40
[1] 41
[1] 42
[1] 43
[1] 44
[1] 45
[1] 46
[1] 47
[1] 48
[1] 49
[1] 50
[1] 51
[1] 52
[1] 53
[1] 54
[1] 55
[1] 56
[1] 57
[1] 58
[1] 59
[1] 60
[1] 61
[1] 62
[1] 63
[1] 64
[1] 65
[1] 66
[1] 67
[1] 68
[1] 69
[1] 70
[1] 71
[1] 72
[1] 73
[1] 74
[1] 75
[1] 76
[1] 77
[1] 78
[1] 79
[1] 80
[1] 81
[1] 82
[1] 83
[1] 84
[1] 85
[1] 86
[1] 87
[1] 88
[1] 89
[1] 90
[1] 91
[1] 92
[1] 93
[1] 94
[1] 95
[1] 96
[1] 97
[1] 98
[1] 99
[1] 100
[1] 101
[1] 102
[1] 103
[1] 104
[1] 105
[1] 106
[1] 107
[1] 108
[1] 109
[1] 110
[1] 111
[1] 112
[1] 113
[1] 114
[1] 115
[1] 116
[1] 117
[1] 118
[1] 119
[1] 120
[1] 121
[1] 122
[1] 123
[1] 124
[1] 125
[1] 126
[1] 127
[1] 128
[1] 129
[1] 130
[1] 131
[1] 132
[1] 133
[1] 134
[1] 135
[1] 136
[1] 137
[1] 138
[1] 139
[1] 140
[1] 141
[1] 142
[1] 143
[1] 144
[1] 145
[1] 146
[1] 147
[1] 148
[1] 149
[1] 150
[1] 151
[1] 152
[1] 153
[1] 154
[1] 155
[1] 156
[1] 157
[1] 158
[1] 159
[1] 160
[1] 161
[1] 162
[1] 163
[1] 164
[1] 165
[1] 166
[1] 167
[1] 168
[1] 169
[1] 170
[1] 171
[1] 172
[1] 173
[1] 174
[1] 175
[1] 176
[1] 177
[1] 178
[1] 179
[1] 180
[1] 181
[1] 182
[1] 183
[1] 184
[1] 185
[1] 186
[1] 187
[1] 188
[1] 189
[1] 190
[1] 191
[1] 192
[1] 193
[1] 194
[1] 195
[1] 196
[1] 197
[1] 198
[1] 199
[1] 200
[1] 201
[1] 202
[1] 203
[1] 204
[1] 205
[1] 206
[1] 207
[1] 208
[1] 209
[1] 210
[1] 211
[1] 212
[1] 213
[1] 214
[1] 215
[1] 216
[1] 217
[1] 218
[1] 219
[1] 220
[1] 221
[1] 222
[1] 223
[1] 224
[1] 225
[1] 226
[1] 227
[1] 228
[1] 229
[1] 230
[1] 231
[1] 232
[1] 233
[1] 234
[1] 235
[1] 236
[1] 237
[1] 238
[1] 239
[1] 240
[1] 241
[1] 242
[1] 243
[1] 244
[1] 245
[1] 246
[1] 247
[1] 248
[1] 249
[1] 250
[1] 251
[1] 252
[1] 253
[1] 254
[1] 255
[1] 256
[1] 257
[1] 258
[1] 259
[1] 260
[1] 261
[1] 262
[1] 263
[1] 264
[1] 265
[1] 266
[1] 267
[1] 268
[1] 269
[1] 270
[1] 271
[1] 272
[1] 273
[1] 274
[1] 275
[1] 276
[1] 277
[1] 278
[1] 279
[1] 280
[1] 281
[1] 282
[1] 283
[1] 284
[1] 285
[1] 286
[1] 287
[1] 288
[1] 289
[1] 290
[1] 291
[1] 292
[1] 293
[1] 294
[1] 295
[1] 296
[1] 297
[1] 298
[1] 299
[1] 300
[1] 301
[1] 302
[1] 303
[1] 304
[1] 305
[1] 306
[1] 307
[1] 308
[1] 309
[1] 310
[1] 311
[1] 312
[1] 313
[1] 314
[1] 315
[1] 316
[1] 317
[1] 318
[1] 319
[1] 320
[1] 321
[1] 322
[1] 323
[1] 324
[1] 325
[1] 326
[1] 327
[1] 328
[1] 329
[1] 330
[1] 331
[1] 332
[1] 333
[1] 334
[1] 335
[1] 336
[1] 337
[1] 338
[1] 339
[1] 340
[1] 341
[1] 342
[1] 343
[1] 344
[1] 345
[1] 346
[1] 347
[1] 348
[1] 349
[1] 350
[1] 351
[1] 352
[1] 353
[1] 354
[1] 355
[1] 356
[1] 357
[1] 358
[1] 359
[1] 360
[1] 361
[1] 362
[1] 363
[1] 364
[1] 365
[1] 366
[1] 367
[1] 368
[1] 369
[1] 370
[1] 371
[1] 372
[1] 373
[1] 374
[1] 375
[1] 376
[1] 377
[1] 378
[1] 379
[1] 380
[1] 381
[1] 382
[1] 383
[1] 384
[1] 385
[1] 386
[1] 387
[1] 388
[1] 389
[1] 390
[1] 391
[1] 392
[1] 393
[1] 394
[1] 395
[1] 396
[1] 397
[1] 398
[1] 399
[1] 400
[1] 401
[1] 402
[1] 403
[1] 404
[1] 405
[1] 406
[1] 407
[1] 408
[1] 409
[1] 410
[1] 411
[1] 412
[1] 413
[1] 414
[1] 415
[1] 416
[1] 417
[1] 418
[1] 419
[1] 420
[1] 421
[1] 422
[1] 423
[1] 424
[1] 425
[1] 426
[1] 427
[1] 428
[1] 429
[1] 430
[1] 431
[1] 432
[1] 433
[1] 434
[1] 435
[1] 436
[1] 437
[1] 438
[1] 439
[1] 440
[1] 441
[1] 442
[1] 443
[1] 444
[1] 445
[1] 446
[1] 447
[1] 448
[1] 449
[1] 450
[1] 451
[1] 452
[1] 453
[1] 454
[1] 455
[1] 456
[1] 457
[1] 458
[1] 459
[1] 460
[1] 461
[1] 462
[1] 463
[1] 464
[1] 465
[1] 466
[1] 467
[1] 468
[1] 469
[1] 470
[1] 471
[1] 472
[1] 473
[1] 474
[1] 475
[1] 476
[1] 477
[1] 478
[1] 479
[1] 480
[1] 481
[1] 482
[1] 483
[1] 484
[1] 485
[1] 486
[1] 487
[1] 488
[1] 489
[1] 490
[1] 491
[1] 492
[1] 493
[1] 494
[1] 495
[1] 496
[1] 497
[1] 498
[1] 499
[1] 500
[1] 501
[1] 502
[1] 503
[1] 504
[1] 505
[1] 506
[1] 507
[1] 508
[1] 509
[1] 510
[1] 511
[1] 512
[1] 513
[1] 514
[1] 515
[1] 516
[1] 517
[1] 518
[1] 519
[1] 520
[1] 521
[1] 522
[1] 523
[1] 524
[1] 525
[1] 526
[1] 527
[1] 528
[1] 529
[1] 530
[1] 531
[1] 532
[1] 533
[1] 534
[1] 535
[1] 536
[1] 537
[1] 538
[1] 539
[1] 540
[1] 541
[1] 542
[1] 543
[1] 544
[1] 545
[1] 546
[1] 547
[1] 548
[1] 549
[1] 550
[1] 551
[1] 552
[1] 553
[1] 554
[1] 555
[1] 556
[1] 557
[1] 558
[1] 559
[1] 560
[1] 561
[1] 562
[1] 563
[1] 564
[1] 565
[1] 566
[1] 567
[1] 568
[1] 569
[1] 570
[1] 571
[1] 572
[1] 573
[1] 574
[1] 575
[1] 576
[1] 577
[1] 578
[1] 579
[1] 580
[1] 581
[1] 582
[1] 583
[1] 584
[1] 585
[1] 586
[1] 587
[1] 588
[1] 589
[1] 590
[1] 591
[1] 592
[1] 593
[1] 594
[1] 595
[1] 596
[1] 597
[1] 598
[1] 599
[1] 600
[1] 601
[1] 602
[1] 603
[1] 604
[1] 605
[1] 606
[1] 607
[1] 608
[1] 609
[1] 610
[1] 611
[1] 612
[1] 613
[1] 614
[1] 615
[1] 616
[1] 617
[1] 618
[1] 619
[1] 620
[1] 621
[1] 622
[1] 623
[1] 624
[1] 625
[1] 626
[1] 627
[1] 628
[1] 629
[1] 630
[1] 631
[1] 632
[1] 633
[1] 634
[1] 635
[1] 636
[1] 637
[1] 638
[1] 639
[1] 640
[1] 641
[1] 642
[1] 643
[1] 644
[1] 645
[1] 646
[1] 647
[1] 648
[1] 649
[1] 650
[1] 651
[1] 652
[1] 653
[1] 654
[1] 655
[1] 656
[1] 657
[1] 658
[1] 659
[1] 660
[1] 661
[1] 662
[1] 663
[1] 664
[1] 665
[1] 666
[1] 667
[1] 668
[1] 669
[1] 670
[1] 671
[1] 672
[1] 673
[1] 674
[1] 675
[1] 676
[1] 677
[1] 678
[1] 679
[1] 680
[1] 681
[1] 682
[1] 683
[1] 684
[1] 685
[1] 686
[1] 687
[1] 688
[1] 689
[1] 690
[1] 691
[1] 692
[1] 693
[1] 694
[1] 695
[1] 696
[1] 697
[1] 698
[1] 699
[1] 700
[1] 701
[1] 702
[1] 703
[1] 704
[1] 705
[1] 706
[1] 707
[1] 708
[1] 709
[1] 710
[1] 711
[1] 712
[1] 713
[1] 714
[1] 715
[1] 716
[1] 717
[1] 718
[1] 719
[1] 720
[1] 721
[1] 722
[1] 723
[1] 724
[1] 725
[1] 726
[1] 727
[1] 728
[1] 729
[1] 730
[1] 731
[1] 732
[1] 733
[1] 734
[1] 735
[1] 736
[1] 737
[1] 738
[1] 739
[1] 740
[1] 741
[1] 742
[1] 743
[1] 744
[1] 745
[1] 746
[1] 747
[1] 748
[1] 749
[1] 750
[1] 751
[1] 752
[1] 753
[1] 754
[1] 755
[1] 756
[1] 757
[1] 758
[1] 759
[1] 760
[1] 761
[1] 762
[1] 763
[1] 764
[1] 765
[1] 766
[1] 767
[1] 768
[1] 769
[1] 770
[1] 771
[1] 772
[1] 773
[1] 774
[1] 775
[1] 776
[1] 777
[1] 778
[1] 779
[1] 780
[1] 781
[1] 782
[1] 783
[1] 784
[1] 785
[1] 786
[1] 787
[1] 788
[1] 789
[1] 790
[1] 791
[1] 792
[1] 793
[1] 794
[1] 795
[1] 796
[1] 797
[1] 798
[1] 799
[1] 800
[1] 801
[1] 802
[1] 803
[1] 804
[1] 805
[1] 806
[1] 807
[1] 808
[1] 809
[1] 810
[1] 811
[1] 812
[1] 813
[1] 814
[1] 815
[1] 816
[1] 817
[1] 818
[1] 819
[1] 820
[1] 821
[1] 822
[1] 823
[1] 824
[1] 825
[1] 826
[1] 827
[1] 828
[1] 829
[1] 830
[1] 831
[1] 832
[1] 833
[1] 834
[1] 835
[1] 836
[1] 837
[1] 838
[1] 839
[1] 840
[1] 841
[1] 842
[1] 843
[1] 844
[1] 845
[1] 846
[1] 847
[1] 848
[1] 849
[1] 850
[1] 851
[1] 852
[1] 853
[1] 854
[1] 855
[1] 856
[1] 857
[1] 858
[1] 859
[1] 860
[1] 861
[1] 862
[1] 863
[1] 864
[1] 865
[1] 866
[1] 867
[1] 868
[1] 869
[1] 870
[1] 871
[1] 872
[1] 873
[1] 874
[1] 875
[1] 876
[1] 877
[1] 878
[1] 879
[1] 880
[1] 881
[1] 882
[1] 883
[1] 884
[1] 885
[1] 886
[1] 887
[1] 888
[1] 889
[1] 890
[1] 891
[1] 892
[1] 893
[1] 894
[1] 895
[1] 896
[1] 897
[1] 898
[1] 899
[1] 900
[1] 901
[1] 902
[1] 903
[1] 904
[1] 905
[1] 906
[1] 907
[1] 908
[1] 909
[1] 910
[1] 911
[1] 912
[1] 913
[1] 914
[1] 915
[1] 916
[1] 917
[1] 918
[1] 919
[1] 920
[1] 921
[1] 922
[1] 923
[1] 924
[1] 925
[1] 926
[1] 927
[1] 928
[1] 929
[1] 930
[1] 931
[1] 932
[1] 933
[1] 934
[1] 935
[1] 936
[1] 937
[1] 938
[1] 939
[1] 940
[1] 941
[1] 942
[1] 943
[1] 944
[1] 945
[1] 946
[1] 947
[1] 948
[1] 949
[1] 950
[1] 951
[1] 952
[1] 953
[1] 954
[1] 955
[1] 956
[1] 957
[1] 958
[1] 959
[1] 960
[1] 961
[1] 962
[1] 963
[1] 964
[1] 965
[1] 966
[1] 967
[1] 968
[1] 969
[1] 970
[1] 971
[1] 972
[1] 973
[1] 974
[1] 975
[1] 976
[1] 977
[1] 978
[1] 979
[1] 980
[1] 981
[1] 982
[1] 983
[1] 984
[1] 985
[1] 986
[1] 987
[1] 988
[1] 989
[1] 990
[1] 991
[1] 992
[1] 993
[1] 994
[1] 995
[1] 996
[1] 997
[1] 998
[1] 999
[1] 1000
  
#reduce to mean and standard deviation
predicted_dissim_trends_rnormruns_constanttempfishing[,mean_dissim_coef:= mean(estimate),survey_unit][,sd_dissim := sd(estimate),.(survey_unit)]

predicted_dissim_trends_rnormrunsconstant_tempfishing.summary <- unique(predicted_dissim_trends_rnormruns_constanttempfishing[,.(survey_unit, mean_dissim_coef, sd_dissim)])

predicted_dissim_trends_rnormrunsconstant_tempfishing.summary[,pred_type := "fishing_and_temp_constant"]

predicted_dissim_trends_rnormruns.summary <- rbind(predicted_dissim_trends_rnormruns.summary, predicted_dissim_trends_rnormrunsconstant_tempfishing.summary)

Plotting observed vs predicted


jaccard_fishing_temp_model_observed_predicted_dt <- jaccard_total_coefs.r[predicted_dissim_trends_rnormruns.summary, on = "survey_unit"]

jaccard_fishing_temp_model_observed_predicted_dt[,pred_lower := mean_dissim_coef-sd_dissim][,pred_upper := mean_dissim_coef+sd_dissim]

#FULL MODEL, both temperature and fishing are allowed to vary
jaccard_fishing_temp_model_observed_predicted_lm <- lm(estimate ~ mean_dissim_coef, data = jaccard_fishing_temp_model_observed_predicted_dt[pred_type == "full"])
summary(jaccard_fishing_temp_model_observed_predicted_lm) #R^2 0.56

Call:
lm(formula = estimate ~ mean_dissim_coef, data = jaccard_fishing_temp_model_observed_predicted_dt[pred_type == 
    "full"])

Residuals:
       Min         1Q     Median         3Q        Max 
-0.0022236 -0.0006394 -0.0001630  0.0003886  0.0039875 

Coefficients:
                  Estimate Std. Error t value Pr(>|t|)    
(Intercept)      2.548e-05  2.631e-04   0.097 0.923498    
mean_dissim_coef 1.145e+00  3.086e-01   3.709 0.000843 ***
---
Signif. codes:  0 ā€˜***’ 0.001 ā€˜**’ 0.01 ā€˜*’ 0.05 ā€˜.’ 0.1 ā€˜ ’ 1

Residual standard error: 0.001482 on 30 degrees of freedom
Multiple R-squared:  0.3144,    Adjusted R-squared:  0.2916 
F-statistic: 13.76 on 1 and 30 DF,  p-value: 0.000843
(jaccard_fishing_temp_model_observed_predicted <- ggplot(jaccard_fishing_temp_model_observed_predicted_dt[pred_type == "full"]) +
  geom_errorbar(aes(x = mean_dissim_coef, ymin = lwr, ymax = upr), color = "lightgrey", linewidth = 0.4) +
  geom_errorbarh(aes(y = estimate, xmin = mean_dissim_coef-sd_dissim, xmax = mean_dissim_coef+sd_dissim), color = "lightgrey", linewidth = 0.4) +
  geom_point(aes(y = estimate, x = mean_dissim_coef)) +
  geom_smooth(aes(y = estimate, x = mean_dissim_coef), color = "darkgrey",linetype = "dotted", method = "lm") +
  geom_abline(aes(slope = 1, intercept = 0)) +
  lims(x = c(min(jaccard_fishing_temp_model_observed_predicted_dt$pred_lower),max(jaccard_fishing_temp_model_observed_predicted_dt$pred_upper))) +
  labs(y = "Observed β-diversity trend",x = "Predicted β-diversity trend\n") +
  theme_classic()
)


#fishing constant (fishing constant; temperature varies only)
jaccard_fishing_constant_model_observed_predicted_lm <- lm(estimate ~ mean_dissim_coef, data = jaccard_fishing_temp_model_observed_predicted_dt[pred_type == "fishing_constant"])
summary(jaccard_fishing_constant_model_observed_predicted_lm) 

Call:
lm(formula = estimate ~ mean_dissim_coef, data = jaccard_fishing_temp_model_observed_predicted_dt[pred_type == 
    "fishing_constant"])

Residuals:
       Min         1Q     Median         3Q        Max 
-2.810e-03 -1.001e-03 -2.156e-05  7.396e-04  2.963e-03 

Coefficients:
                  Estimate Std. Error t value Pr(>|t|)   
(Intercept)      4.812e-06  2.656e-04   0.018  0.98567   
mean_dissim_coef 2.149e+00  5.926e-01   3.626  0.00105 **
---
Signif. codes:  0 ā€˜***’ 0.001 ā€˜**’ 0.01 ā€˜*’ 0.05 ā€˜.’ 0.1 ā€˜ ’ 1

Residual standard error: 0.001492 on 30 degrees of freedom
Multiple R-squared:  0.3047,    Adjusted R-squared:  0.2816 
F-statistic: 13.15 on 1 and 30 DF,  p-value: 0.001054
#Temperature as a predictor, not fishing = R^2 = 0.40 (drop in 16% of variance explained when you lose fishing as predictor)

(jaccard_fishing_constant_model_observed_predicted <- ggplot(jaccard_fishing_temp_model_observed_predicted_dt[pred_type == "fishing_constant"]) +
geom_errorbar(aes(x = mean_dissim_coef, ymin = lwr, ymax = upr), color = "lightgrey", linewidth = 0.4) +
  geom_errorbarh(aes(y = estimate, xmin = mean_dissim_coef-sd_dissim, xmax = mean_dissim_coef+sd_dissim), color = "lightgrey", linewidth = 0.4) +
  geom_point(aes(y = estimate, x = mean_dissim_coef)) +
    geom_smooth(aes(y = estimate, x = mean_dissim_coef), color = "darkgrey",linetype = "dotted", method = "lm") +
  geom_abline(aes(slope = 1, intercept = 0)) +
      lims(x = c(min(jaccard_fishing_temp_model_observed_predicted_dt$pred_lower),max(jaccard_fishing_temp_model_observed_predicted_dt$pred_upper))) +
  labs(y = "Observed β-diversity trend",x = "Predicted β-diversity trend\n(temperature varies fishing constant)") +
  theme_classic()
)


#temp constant (fishing only; temperature constant)
jaccard_temperature_constant_model_observed_predicted_lm <- lm(estimate ~ mean_dissim_coef, data = jaccard_fishing_temp_model_observed_predicted_dt[pred_type == "temp_constant"])
summary(jaccard_temperature_constant_model_observed_predicted_lm) #0.26 Drop in 30% of variance explained when you lose temperature as a predictor

Call:
lm(formula = estimate ~ mean_dissim_coef, data = jaccard_fishing_temp_model_observed_predicted_dt[pred_type == 
    "temp_constant"])

Residuals:
       Min         1Q     Median         3Q        Max 
-0.0023482 -0.0005425 -0.0002359  0.0003885  0.0042139 

Coefficients:
                  Estimate Std. Error t value Pr(>|t|)   
(Intercept)      5.524e-05  2.743e-04   0.201  0.84174   
mean_dissim_coef 9.948e-01  3.128e-01   3.180  0.00341 **
---
Signif. codes:  0 ā€˜***’ 0.001 ā€˜**’ 0.01 ā€˜*’ 0.05 ā€˜.’ 0.1 ā€˜ ’ 1

Residual standard error: 0.001548 on 30 degrees of freedom
Multiple R-squared:  0.2521,    Adjusted R-squared:  0.2272 
F-statistic: 10.11 on 1 and 30 DF,  p-value: 0.003408
(jaccard_temperature_constant_model_observed_predicted <- ggplot(jaccard_fishing_temp_model_observed_predicted_dt[pred_type == "temp_constant"]) +
  geom_errorbar(aes(x = mean_dissim_coef, ymin = lwr, ymax = upr), color = "lightgrey", linewidth = 0.4) +
  geom_errorbarh(aes(y = estimate, xmin = mean_dissim_coef-sd_dissim, xmax = mean_dissim_coef+sd_dissim), color = "lightgrey", linewidth = 0.4) +
  geom_point(aes(y = estimate, x = mean_dissim_coef)) +
    geom_smooth(aes(y = estimate, x = mean_dissim_coef), color = "darkgrey",linetype = "dotted", method = "lm") +
  geom_abline(aes(slope = 1, intercept = 0)) +
      lims(x = c(min(jaccard_fishing_temp_model_observed_predicted_dt$pred_lower),max(jaccard_fishing_temp_model_observed_predicted_dt$pred_upper))) +
  labs(y = "Observed β-diversity trend",x = "Predicted β-diversity trend\n(fishing varies temperature constant)") +
  theme_classic()
)


#both temperature and fish held constant
jaccard_fishing_temp_model_observed_predicted_tempfishconstantinsurvey_lm <- lm(estimate ~ mean_dissim_coef, data = jaccard_fishing_temp_model_observed_predicted_dt[pred_type == "fishing_and_temp_constant"])
summary(jaccard_fishing_temp_model_observed_predicted_tempfishconstantinsurvey_lm) #%20 #drop of 36 from full

Call:
lm(formula = estimate ~ mean_dissim_coef, data = jaccard_fishing_temp_model_observed_predicted_dt[pred_type == 
    "fishing_and_temp_constant"])

Residuals:
       Min         1Q     Median         3Q        Max 
-0.0028055 -0.0008924 -0.0002188  0.0007432  0.0035791 

Coefficients:
                  Estimate Std. Error t value Pr(>|t|)   
(Intercept)      5.548e-05  2.829e-04   0.196  0.84587   
mean_dissim_coef 1.722e+00  6.186e-01   2.783  0.00922 **
---
Signif. codes:  0 ā€˜***’ 0.001 ā€˜**’ 0.01 ā€˜*’ 0.05 ā€˜.’ 0.1 ā€˜ ’ 1

Residual standard error: 0.001595 on 30 degrees of freedom
Multiple R-squared:  0.2052,    Adjusted R-squared:  0.1787 
F-statistic: 7.747 on 1 and 30 DF,  p-value: 0.009223
(jaccard_fishing_temp_model_observed_predicted_tempfishconstantinsurvey <- ggplot(jaccard_fishing_temp_model_observed_predicted_dt[pred_type == "fishing_and_temp_constant"]) +
geom_errorbar(aes(x = mean_dissim_coef, ymin = lwr, ymax = upr), color = "lightgrey", linewidth = 0.4) +
  geom_errorbarh(aes(y = estimate, xmin = mean_dissim_coef-sd_dissim, xmax = mean_dissim_coef+sd_dissim), color = "lightgrey", linewidth = 0.4) +
  geom_point(aes(y = estimate, x = mean_dissim_coef)) +
    geom_smooth(aes(y = estimate, x = mean_dissim_coef), color = "darkgrey",linetype = "dotted", method = "lm")+
  geom_abline(aes(slope = 1, intercept = 0)) +
      lims(x = c(min(jaccard_fishing_temp_model_observed_predicted_dt$pred_lower),max(jaccard_fishing_temp_model_observed_predicted_dt$pred_upper))) +
  labs(y = "Observed β-diversity trend",x = "Predicted β-diversity trend\n(fishing and temperature constant)") +
  theme_classic()
)


#merge
jaccard_fishing_sbt_model_observed_predicted_merge <- plot_grid(jaccard_fishing_temp_model_observed_predicted + theme(plot.margin = unit(c(0.1,0.3,0.1,0.1),"cm")),
                                                                     jaccard_fishing_constant_model_observed_predicted + theme(plot.margin = unit(c(0.1,0.3,0.1,0.1),"cm")),
                                                                     jaccard_temperature_constant_model_observed_predicted + theme(plot.margin = unit(c(0.1,0.3,0.1,0.1),"cm")),
                                                                     jaccard_fishing_temp_model_observed_predicted_tempfishconstantinsurvey + theme(plot.margin = unit(c(0.1,0.3,0.1,0.1),"cm")), ncol = 2, labels = c("a.","b.","c.","d."))
`geom_smooth()` using formula = 'y ~ x'`geom_smooth()` using formula = 'y ~ x'`geom_smooth()` using formula = 'y ~ x'`geom_smooth()` using formula = 'y ~ x'
ggsave(jaccard_fishing_sbt_model_observed_predicted_merge, path = here::here("figures"),filename = "jaccard_fishing_sbt_model_observed_predicted_merge.jpg", height =6, width = 8)

NA
NA

###Let’s visualize model coefficients with temperature and fishing (similar to figure 2)


#extract coefficients using linear algebra
interaction_avg_model_coef <- data.table(lm_interaction_coefficients_se(mod_name = model_avg_delta4, model_avg = T, SBT_fish = T))
Warning: NaNs produced
#add survey names
interaction_avg_model_coef[,survey_unit := factor(c(all_surveys[!all_surveys %in% c("ROCKALL", "GSL-S")],all_surveys[!all_surveys %in% c("ROCKALL", "GSL-S")]))]

#add predictor names
interaction_avg_model_coef[,predictor := c(rep("Relative fishing catch",32),rep("Minimum temperature",32))]

#reorder temperature and fishing
interaction_avg_model_coef[,predictor := factor(predictor, levels = c("Minimum temperature","Relative fishing catch"))]

#link for full survey name
interaction_avg_model_coef <- color_link[interaction_avg_model_coef, on = "survey_unit"]

#list of Survey Name Season in order by survey unit
setkey(interaction_avg_model_coef, survey_unit)

survey_name_season_ordered <- unique(interaction_avg_model_coef$Survey_Name_Season)

#Make Survey_Name_Season a factor
interaction_avg_model_coef[,Survey_Name_Season := factor(Survey_Name_Season, levels = survey_name_season_ordered)]


#mark significance
interaction_avg_model_coef[,Significant := ifelse((estimate-se > 0 & estimate+se > 0) | (estimate-se < 0 & estimate+se < 0),T,F)]


#Plot both
sbt_fishing_avg_model_coef <- ggplot() +
  geom_hline(yintercept = 0, linetype = "dotted") +
geom_point(data = interaction_avg_model_coef, aes(x = Survey_Name_Season, y = estimate, color = Significant)) +  
geom_errorbar(data = interaction_avg_model_coef, aes(x = Survey_Name_Season, ymin = estimate-se, ymax = estimate+se, color = Significant), width = 0) +
  scale_color_manual(values = c("darkgrey","black")) +
facet_wrap(~predictor, scales = "free_x") +
scale_x_discrete(limits = rev) +
  labs(y = "Coefficient", x = "") +
coord_flip() +
theme_classic()
  

Plot all other coefficients in averaged model

model_avg_values.nonfishortemp <- model_avg_values[c(2,6,102:106),]

#mark significance
model_avg_values.nonfishortemp[,Significant := ifelse((coef-se > 0 & coef+se > 0) | (coef-se < 0 & coef+se < 0),T,F)]

#more helpful names for variables
model_avg_values.nonfishortemp[,Variable := c("Area","Species count","Depth","Number of tows","Latitude","Depth range","Latitude range")]

#make factor with order
model_avg_values.nonfishortemp[,Variable := factor(Variable, levels = c("Area","Species count","Number of tows","Depth","Depth range","Latitude","Latitude range"))]


#plot
all_avg_model_coef <- ggplot() + 
geom_point(data = model_avg_values.nonfishortemp, aes(x = Variable, y = coef, color = Significant)) +  
geom_errorbar(data = model_avg_values.nonfishortemp, aes(x = Variable, ymin = coef-se, ymax = coef+se, color = Significant), width = 0) +
  scale_color_manual(values = c("darkgrey","black")) +
geom_hline(yintercept = 0) +
scale_x_discrete(limits = rev) +
  labs(y = "Coefficient", x = "\n\n\n") +
coord_flip() +
theme_classic()

#plot
all_but_lat_avg_model_coef <- ggplot() + 
geom_point(data = model_avg_values.nonfishortemp[Variable == "Latitude"], aes(x = Variable, y = coef, color = Significant)) +  
geom_errorbar(data = model_avg_values.nonfishortemp[Variable == "Latitude"], aes(x = Variable, ymin = coef-se, ymax = coef+se, color = Significant), width = 0) +
  scale_color_manual(values = c("darkgrey","black")) +
geom_hline(yintercept = 0) +
scale_x_discrete(limits = rev) +
  labs(y = "Coefficient", x = "Model variable") +
coord_flip() +
theme_classic()

#plot
lat_avg_model_coef <- ggplot() + 
geom_point(data = model_avg_values.nonfishortemp[Variable != "Latitude"], aes(x = Variable, y = coef, color = Significant)) +  
geom_errorbar(data = model_avg_values.nonfishortemp[Variable != "Latitude"], aes(x = Variable, ymin = coef-se, ymax = coef+se, color = Significant), width = 0) +
  scale_color_manual(values = c("darkgrey","black")) +
geom_hline(yintercept = 0) +
scale_x_discrete(limits = rev) +
  labs(y = "Coefficient", x = "Model variable") +
coord_flip() +
theme_classic()

#merge into single plot

model_coef_summary_sbt_jaccard <- cowplot::plot_grid(sbt_fishing_avg_model_coef+theme(legend.position = "null", axis.title.x = element_blank()),all_avg_model_coef+theme(legend.position = "null"), ncol = 1, labels = c("  a.                                                      b.","        c."), label_y = 0.99, rel_heights = c(3,1))

#Figure 3
ggsave(model_coef_summary_sbt_jaccard, path = here::here("figures"),filename = "model_coef_summary_sbt_jaccard.jpg", height = 6.5, width = 8, unit = "in")
ggsave(model_coef_summary_sbt_jaccard, path = here::here("figures"),filename = "Fig3.tiff", height = 6.5, width = 8, unit = "in", dpi = 300, compression = "lzw")

###Investigating what’s going on with Aleutian Islands



#DISSIMILARITY VS TEMPERATURE
ggplot(dissimilarity_covariates_dredge.dt[survey_unit == "AI"]) +
  geom_point(aes(x = yearly_min_bypoint_avg, y = annual_dissimilarity_value)) +
  theme_classic()


#If we ignore two coldest years, we have roughly points at (2.07,0.76) and (2.2, 0.69), slope = -1.8, which matches what we get (also note large confidence bounds)

#So, the question is, what is leading the model to ignore these two years? What explains this variation in the coldest years?


#DISSIMILARITY
ggplot(dissimilarity_covariates_dredge.dt[survey_unit == "AI"]) +
  geom_point(aes(x = area_km, y = annual_dissimilarity_value)) +
  theme_classic()


#Very large sampling area and very low sampling areas are both lowest values

      #TEMPERATURE
      ggplot(dissimilarity_covariates_dredge.dt[survey_unit == "AI"]) +
        geom_point(aes(x = area_km, y = yearly_min_bypoint_avg)) +
        theme_classic()

      
      #Very large sampling area coincides with lowest temperatures
      

#DISSIMILARITY
ggplot(dissimilarity_covariates_dredge.dt[survey_unit == "AI"]) +
  geom_point(aes(x = spp_count_annual, y = annual_dissimilarity_value)) +
  theme_classic()


#Annual dissimilarity value increases with richness

    #TEMPERATURE
    ggplot(dissimilarity_covariates_dredge.dt[survey_unit == "AI"]) +
      geom_point(aes(x = spp_count_annual, y = yearly_min_bypoint_avg)) +
      theme_classic()

    
    #Lowest temperature observation coincides with lowest richness

#DISSIMILARITY
ggplot(dissimilarity_covariates_dredge.dt[survey_unit == "AI"]) +
  geom_point(aes(x = haul_id_count_annual, y = annual_dissimilarity_value)) +
  theme_classic()


#Low number of hauls led to very low annual dissimilarity values

    #TEMPERATURE
    ggplot(dissimilarity_covariates_dredge.dt[survey_unit == "AI"]) +
      geom_point(aes(x = haul_id_count_annual, y = yearly_min_bypoint_avg)) +
      theme_classic()

    
    #Lowest temperature matched with lowest number of samples

#DISSIMILARITY
ggplot(dissimilarity_covariates_dredge.dt[survey_unit == "AI"]) +
  geom_point(aes(x = depth_annual_avg, y = annual_dissimilarity_value)) +
  theme_classic()


#Some deep trawls have very low annual dissimilarity, while other deep trawls have high annual dissimilarity

      #TEMPERATURE
      ggplot(dissimilarity_covariates_dredge.dt[survey_unit == "AI"]) +
        geom_point(aes(x = depth_annual_avg, y = yearly_min_bypoint_avg)) +
        theme_classic()

      
      #Deepest trawls happened on cold days

What leads to variance being explained by variables OTHER than temperature in coldest years So, in summary - Very large sampling area and very small sampling areas are both linked to years of low dissimilarity - Very large sampling area coincides with lowest temperatures - Annual dissimilarity value increases with richness - Lowest temperature observation coincides with lowest richness - Low number of hauls led to very low annual dissimilarity values - Lowest temperature matched with lowest number of samples - Some deep trawls have very low annual dissimilarity, while other deep trawls have high annual dissimilarity - Deepest trawls happened on cold days

For the Aleutian islands, the coldest years were also: - the years of largest sampling area - the years of lowest richness - the years of lowest sampling effort (# tows) - the years of deepest sampling

#IF WE ACTUALLY USE THIS, NEED TO UPDATE ##Show intercepts by region and season # #{r} # ##survey intercepts #survey_intercepts <- model_avg_values[c(1,8:38),.(coef_name, coef, se)] #survey_intercepts[1,survey_unit := "AI"][1,coef_true := coef] #survey_intercepts[2:32,survey_unit := substr(coef_name, 12, str_length(coef_name))][2:32,coef_true := survey_intercepts[1,coef_true]+coef] #survey_intercepts <- color_link[survey_intercepts, on = "survey_unit"] #survey_intercepts[,Survey_Name_Season := reorder(Survey_Name_Season, coef_true)] # # ##season_intercepts #season_intercepts <- model_avg_values[c(1,3:5),.(coef_name, coef, se)] #season_intercepts[1,season := "Spring"][1,coef_true := coef] #season_intercepts[2:4,season := substr(coef_name, 7, str_length(coef_name))][2:4,coef_true := season_intercepts[1,coef_true]+coef] #season_intercepts[,season := reorder(season, coef_true)] # # ##survey intercepts #survey_model_coef <- ggplot() + #geom_point(data = survey_intercepts, aes(x = Survey_Name_Season, y = coef_true)) + #geom_errorbar(data = survey_intercepts, aes(x = Survey_Name_Season, ymin = coef_true-se, ymax = coef_true+se), width = 0) + #scale_x_discrete(limits = rev) + ## ylim(0.35,1) + # labs(y = "Intercept", x = "") + #coord_flip() + #theme_classic() # ##season intercepts #season_model_coef <- ggplot() + #geom_point(data = season_intercepts, aes(x = season, y = coef_true)) + #geom_errorbar(data = season_intercepts, aes(x = season, ymin = coef_true-se, ymax = coef_true+se), width = 0) + #scale_x_discrete(limits = rev) + # # ylim(0.35,1) + # labs(y = "Intercept", x = "") + #coord_flip() + #theme_classic() # ##merge into single plot # #model_intercept_jaccard <- cowplot::plot_grid(survey_model_coef+theme(axis.title.x = element_blank()), # season_model_coef, ncol = 1, labels = c("a.","b."), label_y = 0.99, rel_heights = c(3,1), align = "v") # #ggsave(model_intercept_jaccard, path = here::here("figures"),filename = "model_intercept_jaccard.jpg", height = 6.5, width = 6.5, unit = "in") # # # ##

LS0tCnRpdGxlOiAiTW9kZWwgYW5udWFsIGRpc3NpbWlsYXJpdHkgd2l0aCB0ZW1wZXJhdHVyZSwgZmlzaGluZywgYW5kIHN1cnZleSBpZGVudGl0eSIKb3V0cHV0OiBodG1sX25vdGVib29rCmF1dGhvcjogWm/DqyBKLiBLaXRjaGVsCmRhdGU6IE1heSA2LCAyMDI0Ci0tLQoKU2NyaXB0IDggZm9yIEtpdGNoZWwgZXQgYWwuIDIwMjQgaW4gcHJlcCB0YXhvbm9taWMgZGl2ZXJzaXR5IG1hbnVzY3JpcHQuCgoKYGBge3Igc2V0dXB9CmxpYnJhcnkoZGF0YS50YWJsZSkKbGlicmFyeShNdU1JbikKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGNvd3Bsb3QpCmxpYnJhcnkobG1lNCkKbGlicmFyeShzdHJpbmdyKQpsaWJyYXJ5KG5sbWUpCgojcHVsbCBpbiBmdW5jdGlvbiB0byBjYWxjdWxhdGUgbW9kZWwgZXN0aW1hdGVzIGFuZCBzdGFuZGFyZCBlcnJvcnMKc291cmNlKGhlcmU6OmhlcmUoImFuYWx5c2lzX2NvZGUiLCJleHRyYWN0X2NvZWZmaWNpZW50c19mdW5jdGlvbi5SIikpCmBgYAoKIyMjUHJlZGljdHMgYW5udWFsIGRpc3NpbWlsYXJpdHkgd2l0aCBhbm51YWwgY2hhcmFjdGVyaXN0aWNzLCB0ZW1wZXJhdHVyZSBhbmQgZmlzaGluZyB2YWx1ZXMKClB1bGwgaW4KLSByZWdpb24gYXJlYXMgKGlmIG5vdCBhbHJlYWR5IGxvYWRlZCkKLSByZWdpb24gY2hhcmFjdGVyaXN0aWNzIChpZiBub3QgYWxyZWFkeSBsb2FkZWQpOyBzYXZlUkRTKEZpc2hHbG9iX3JpY2huZXNzX3llYXJfc3VydmV5LCBmaWxlID0gaGVyZTo6aGVyZSgib3V0cHV0IiwiRmlzaEdsb2JfcmljaG5lc3NfeWVhcl9zdXJ2ZXkuUmRzIikpCi0gZmlzaGluZyAoaWYgbm90IGFscmVhZHkgbG9hZGVkKQotIHRlbXAgKGlmIG5vdCBhbHJlYWR5IGxvYWRlZCkKCgpBZGQgc3VydmV5IGFyZWEgdG8gZGlzc2ltaWxhcml0aWVzIGRhdGEgdGFibGUKYGBge3J9CiNwaHlzaWNhbCBhcmVhIGJ5IHllYXIKcmVnaW9uX2FyZWFfYnl5ZWFyIDwtIGZyZWFkKGhlcmU6OmhlcmUoIm91dHB1dCIsInJlZ2lvbl9hcmVhX2J5eWVhci5jc3YiKSkKCiNtZXJnZWQgZmlzaGluZywgdGVtcCwgZGlzc2ltaWxhcml0aWVzCmRpc3NpbWlsYXJpdGllc190ZW1wX2Zpc2hpbmcgPC0gZnJlYWQoaGVyZTo6aGVyZSgib3V0cHV0IiwiZGlzc2ltaWxhcml0aWVzX3RlbXBfZmlzaGluZy5jc3YiKSkKCiNjb21iaW5lCmRpc3NpbWlsYXJpdGllc190ZW1wX2Zpc2hpbmdfYXJlYSA8LSBkaXNzaW1pbGFyaXRpZXNfdGVtcF9maXNoaW5nW3JlZ2lvbl9hcmVhX2J5eWVhciwgb24gPSBjKCJzdXJ2ZXlfdW5pdCIsInllYXIiKV0KCiNvbmx5IG9jY3VycmVuY2UtYmFzZWQgamFjY2FyZCBmb3IgdGhlc2UgYW5hbHlzZXMKZGlzc2ltaWxhcml0aWVzX3RlbXBfZmlzaGluZ19hcmVhLmphY2NhcmQgPC0gZGlzc2ltaWxhcml0aWVzX3RlbXBfZmlzaGluZ19hcmVhW2Rpc3NpbWlsYXJpdHlfbWV0cmljID09ICJqYWNjYXJkX2Rpc3NpbWlsYXJpdHlfaW5kZXhfYmluYXJ5IixdCmBgYAoKQWRkIGluIHNlYXNvbi9KdWxpYW4gZGF5IHRvIGRpc3NpbWlsYXJpdGllcyBkYXRhIHRhYmxlCmBgYHtyfQojbG9hZCB1cCBqdWxpYW4gZGF5cwpkYXRlc19yZWdpb25zIDwtIHJlYWRSRFMoaGVyZTo6aGVyZSgib3V0cHV0IiwiZGF0ZXNfcmVnaW9ucy5yZHMiKSkKCiNtb3N0IGNvbW1vbiBzZWFzb24gcGVyIHllYXIKIyBGdW5jdGlvbiB0byBnZXQgdGhlIG1vc3QgZnJlcXVlbnQgdmFsdWUKZ2V0X21vZGUgPC0gZnVuY3Rpb24oeCkgewogIHV4IDwtIHVuaXF1ZSh4KQogIHV4W3doaWNoLm1heCh0YWJ1bGF0ZShtYXRjaCh4LCB1eCkpKV0KfQoKIyBBcHBseSB0aGUgZnVuY3Rpb24gdG8gZWFjaCBncm91cApkYXRlc19yZWdpb25zLnIgPC0gZGF0ZXNfcmVnaW9uc1ssIC4oc2Vhc29uID0gZ2V0X21vZGUoc2Vhc29uKSksIGJ5ID0gYygic3VydmV5X3VuaXQiLCJ5ZWFyIildCgoKI21lcmdlCmRpc3NpbWlsYXJpdGllc190ZW1wX2Zpc2hpbmdfYXJlYS5qYWNjYXJkIDwtIGRhdGVzX3JlZ2lvbnMucltkaXNzaW1pbGFyaXRpZXNfdGVtcF9maXNoaW5nX2FyZWEuamFjY2FyZCwgb24gPSBjKCJzdXJ2ZXlfdW5pdCIsInllYXIiKV0KYGBgCgogClB1bGwgaW4gcGFsZXR0ZSBhbmQgbmFtZSBoZWxwZXIKYGBge3J9CnNvdXJjZShoZXJlOjpoZXJlKCJhbmFseXNpc19jb2RlIiwiY29sb3JfbGlua3MuUiIpKQpgYGAKClB1bGwgaW4gb2JzZXJ2ZWQgZGlzc2ltaWxhcml0eSB0cmVuZCB2YWx1ZXMKYGBge3J9CmphY2NhcmRfdG90YWxfY29lZnMuciA8LSBmcmVhZChoZXJlOjpoZXJlKCJvdXRwdXQiLCJqYWNjYXJkX3RvdGFsX2NvZWZzLnIuY3N2IikpCmBgYAoKUGxvdCBmaXNoaW5nIGFuZCB0ZW1wZXJhdHVyZSB2cy4gdGltZSBmb3IgYWxsIHJlZ2lvbnMKYGBge3J9CiMjIyMjIyNURU1QRVJBVFVSRQoKI3NldCBvcmRlciBieSBzdXJ2ZXkgdW5pdCBmb3IgcGxvdHRpbmcKYWxsX3N1cnZleXMgPC0gbGV2ZWxzKGFzLmZhY3RvcihkaXNzaW1pbGFyaXRpZXNfdGVtcF9maXNoaW5nX2FyZWEuamFjY2FyZCRzdXJ2ZXlfdW5pdCkpCnNldG9yZGVyKGRpc3NpbWlsYXJpdGllc190ZW1wX2Zpc2hpbmdfYXJlYS5qYWNjYXJkLCBzdXJ2ZXlfdW5pdCkKCmRpc3NpbWlsYXJpdGllc190ZW1wX2Zpc2hpbmdfYXJlYS5qYWNjYXJkWyxTdXJ2ZXlfTmFtZV9TZWFzb246PWZhY3RvcihTdXJ2ZXlfTmFtZV9TZWFzb24sIGxldmVscyA9IHVuaXF1ZShkaXNzaW1pbGFyaXRpZXNfdGVtcF9maXNoaW5nX2FyZWEuamFjY2FyZCRTdXJ2ZXlfTmFtZV9TZWFzb24pLCBvcmRlcmVkID0gVCldCgooc2J0X3RpbWVfc3VydmV5X2ZhY2V0XzFfMjAgPC0gZ2dwbG90KGRhdGEgPSBkaXNzaW1pbGFyaXRpZXNfdGVtcF9maXNoaW5nX2FyZWEuamFjY2FyZFtzdXJ2ZXlfdW5pdCAlaW4lIGFsbF9zdXJ2ZXlzWzE6MjBdICYgeWVhciA+IDE5NzldKSArCiAgbGFicyh5ID0gIk1lYW4gYm90dG9tIHRlbXBlcmF0dXJlICjLmkMpIiwgIHggPSAiWWVhciIpICsKICBnZW9tX3BvaW50KGFlcyh5ID0gYXMubnVtZXJpYyh5ZWFybHlfbWVhbl9ieXBvaW50X2F2ZyksIHggPSB5ZWFyKSwgYWxwaGEgPSAwLjMpICsKICBnZW9tX3Ntb290aChhZXMoeSA9IGFzLm51bWVyaWMoeWVhcmx5X21lYW5fYnlwb2ludF9hdmcpLCB4ID0geWVhciksIG1ldGhvZCA9ICJsbSIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gfiBheGlzVGlja3MoLiwgbG9nID0gRkFMU0UpKSArCiAgdGhlbWVfY2xhc3NpYygpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gNykpICsKICBmYWNldF93cmFwKH5TdXJ2ZXlfTmFtZV9TZWFzb24sIHNjYWxlcz0gImZyZWUiLCBuY29sID0gNCkpCgpnZ3NhdmUoc2J0X3RpbWVfc3VydmV5X2ZhY2V0XzFfMjAsIHBhdGggPSBoZXJlOjpoZXJlKCJmaWd1cmVzIiksIGZpbGVuYW1lID0gInNidF90aW1lX3N1cnZleV9mYWNldF8xXzIwLmpwZyIsIGhlaWdodCA9IDEyLCB3aWR0aCA9OSkKCihzYnRfdGltZV9zdXJ2ZXlfZmFjZXRfMjFfMzQgPC0gZ2dwbG90KGRhdGEgPSBkaXNzaW1pbGFyaXRpZXNfdGVtcF9maXNoaW5nX2FyZWEuamFjY2FyZFtzdXJ2ZXlfdW5pdCAlaW4lIGFsbF9zdXJ2ZXlzWzIxOjM0XSAmIHllYXIgPiAxOTc5XSkgKwogIGxhYnMoeSA9ICJNZWFuIGJvdHRvbSB0ZW1wZXJhdHVyZSAoy5pDKSIsICB4ID0gIlllYXIiKSArCiAgZ2VvbV9wb2ludChhZXMoeSA9IGFzLm51bWVyaWMoeWVhcmx5X21lYW5fYnlwb2ludF9hdmcpLCB4ID0geWVhciksIGFscGhhID0gMC4zKSArCiAgZ2VvbV9zbW9vdGgoYWVzKHkgPSBhcy5udW1lcmljKHllYXJseV9tZWFuX2J5cG9pbnRfYXZnKSwgeCA9IHllYXIpLCBtZXRob2QgPSAibG0iKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IH4gYXhpc1RpY2tzKC4sIGxvZyA9IEZBTFNFKSkgKwogIHRoZW1lX2NsYXNzaWMoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcpKSArCiAgZmFjZXRfd3JhcCh+U3VydmV5X05hbWVfU2Vhc29uLCBzY2FsZXM9ICJmcmVlIiwgbmNvbCA9IDQpKQoKZ2dzYXZlKHNidF90aW1lX3N1cnZleV9mYWNldF8yMV8zNCwgcGF0aCA9IGhlcmU6OmhlcmUoImZpZ3VyZXMiKSwgZmlsZW5hbWUgPSAic2J0X3RpbWVfc3VydmV5X2ZhY2V0XzIxXzM0LmpwZyIsIGhlaWdodCA9IDEyLCB3aWR0aCA9OSkKCiMjIyMjIyNGSVNISU5HCgpkaXNzaW1pbGFyaXRpZXNfdGVtcF9maXNoaW5nX2FyZWEuamFjY2FyZC5jYyA8LSBkaXNzaW1pbGFyaXRpZXNfdGVtcF9maXNoaW5nX2FyZWEuamFjY2FyZFtjb21wbGV0ZS5jYXNlcyhkaXNzaW1pbGFyaXRpZXNfdGVtcF9maXNoaW5nX2FyZWEuamFjY2FyZFssc3VtbWVkX3Rvbm5lc19zY2FsZWRfYnlyZWddKSxdCgooZmlzaGluZ190aW1lX3N1cnZleV9mYWNldF8xXzIwIDwtIGdncGxvdChkYXRhID0gZGlzc2ltaWxhcml0aWVzX3RlbXBfZmlzaGluZ19hcmVhLmphY2NhcmQuY2Nbc3VydmV5X3VuaXQgJWluJSBhbGxfc3VydmV5c1sxOjIwXSAmIHllYXIgPiAxOTc5XSkgKwogIGxhYnMoeSA9ICJSZWxhdGl2ZSBmaXNoaW5nIGNhdGNoIiwgIHggPSAiWWVhciIpICsKICBnZW9tX3BvaW50KGFlcyh5ID0gc3VtbWVkX3Rvbm5lc19zY2FsZWRfYnlyZWcsIHggPSB5ZWFyKSwgYWxwaGEgPSAwLjMpICsKICBnZW9tX3Ntb290aChhZXMoeSA9IHN1bW1lZF90b25uZXNfc2NhbGVkX2J5cmVnLCB4ID0geWVhciksIG1ldGhvZCA9ICJsbSIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gfiBheGlzVGlja3MoLiwgbG9nID0gRkFMU0UpKSArCiAgdGhlbWVfY2xhc3NpYygpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gNykpICsKICBmYWNldF93cmFwKH5TdXJ2ZXlfTmFtZV9TZWFzb24sIHNjYWxlcz0gImZyZWUiLCBuY29sID0gNCkpCgpnZ3NhdmUoZmlzaGluZ190aW1lX3N1cnZleV9mYWNldF8xXzIwLCBwYXRoID0gaGVyZTo6aGVyZSgiZmlndXJlcyIpLCBmaWxlbmFtZSA9ICJmaXNoaW5nX3RpbWVfc3VydmV5X2ZhY2V0XzFfMjAuanBnIiwgaGVpZ2h0ID0gMTIsIHdpZHRoID05KQoKKGZpc2hpbmdfdGltZV9zdXJ2ZXlfZmFjZXRfMjFfMzQgPC0gZ2dwbG90KGRhdGEgPSBkaXNzaW1pbGFyaXRpZXNfdGVtcF9maXNoaW5nX2FyZWEuamFjY2FyZC5jY1tzdXJ2ZXlfdW5pdCAlaW4lIGFsbF9zdXJ2ZXlzW2MoMjE6MzQpXSAmIHllYXIgPiAxOTc5XSkgKwogIGxhYnMoeSA9ICJSZWxhdGl2ZSBmaXNoaW5nIGNhdGNoIiwgIHggPSAiWWVhciIpICsKICBnZW9tX3BvaW50KGFlcyh5ID0gc3VtbWVkX3Rvbm5lc19zY2FsZWRfYnlyZWcsIHggPSB5ZWFyKSwgYWxwaGEgPSAwLjMpICsKICBnZW9tX3Ntb290aChhZXMoeSA9IHN1bW1lZF90b25uZXNfc2NhbGVkX2J5cmVnLCB4ID0geWVhciksIG1ldGhvZCA9ICJsbSIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gfiBheGlzVGlja3MoLiwgbG9nID0gRkFMU0UpKSArCiAgdGhlbWVfY2xhc3NpYygpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gNykpICsKICBmYWNldF93cmFwKH5TdXJ2ZXlfTmFtZV9TZWFzb24sIHNjYWxlcz0gImZyZWUiLCBuY29sID0gNCkpCgpnZ3NhdmUoZmlzaGluZ190aW1lX3N1cnZleV9mYWNldF8yMV8zNCwgcGF0aCA9IGhlcmU6OmhlcmUoImZpZ3VyZXMiKSwgZmlsZW5hbWUgPSAiZmlzaGluZ190aW1lX3N1cnZleV9mYWNldF8yMV8zNC5qcGciLCBoZWlnaHQgPSAxMiwgd2lkdGggPTkpCgoKYGBgCgpQbG90IGZpc2hpbmcgYW5kIHRlbXBlcmF0dXJlIHZzLiBkaXNzaW1pbGFyaXR5IGZvciBhbGwgcmVnaW9ucwpgYGB7cn0KIyMjIyNNRUFOIFRFTVAKKHByZWRzX3NidF9tZWFuX3RlbXBfc3VydmV5X2ZhY2V0XzFfMjAgPC0gZ2dwbG90KGRhdGEgPSBkaXNzaW1pbGFyaXRpZXNfdGVtcF9maXNoaW5nX2FyZWEuamFjY2FyZFtzdXJ2ZXlfdW5pdCAlaW4lIGFsbF9zdXJ2ZXlzWzE6MjBdICYgeWVhciA+IDE5NzldKSArCiAgbGFicyh4ID0gIk1lYW4gYm90dG9tIHRlbXBlcmF0dXJlICjLmkMpIiwgIHkgPSAizrItZGl2ZXJzaXR5IikgKwogIGdlb21fcG9pbnQoYWVzKHggPSBhcy5udW1lcmljKHllYXJseV9tZWFuX2J5cG9pbnRfYXZnKSwgeSA9IGFubnVhbF9kaXNzaW1pbGFyaXR5X3ZhbHVlKSwgYWxwaGEgPSAwLjMpICsKICBnZW9tX3Ntb290aChhZXMoeCA9IGFzLm51bWVyaWMoeWVhcmx5X21lYW5fYnlwb2ludF9hdmcpLCB5ID0gYW5udWFsX2Rpc3NpbWlsYXJpdHlfdmFsdWUpLCBtZXRob2QgPSAibG0iKSArCiAgZmFjZXRfd3JhcCh+U3VydmV5X05hbWVfU2Vhc29uLCBzY2FsZXM9ICJmcmVlIiwgbmNvbCA9IDQpICsKICB0aGVtZV9jbGFzc2ljKCkpCgpnZ3NhdmUocHJlZHNfc2J0X21lYW5fdGVtcF9zdXJ2ZXlfZmFjZXRfMV8yMCwgcGF0aCA9IGhlcmU6OmhlcmUoImZpZ3VyZXMiKSwgZmlsZW5hbWUgPSAicHJlZHNfc2J0X21lYW5fdGVtcF9zdXJ2ZXlfZmFjZXRfMV8yMC5qcGciLCBoZWlnaHQgPSAxMiwgd2lkdGggPTkpCgoocHJlZHNfc2J0X21lYW5fdGVtcF9zdXJ2ZXlfZmFjZXRfMjFfMzQgPC0gZ2dwbG90KGRhdGEgPSBkaXNzaW1pbGFyaXRpZXNfdGVtcF9maXNoaW5nX2FyZWEuamFjY2FyZFtzdXJ2ZXlfdW5pdCAlaW4lIGFsbF9zdXJ2ZXlzWzIxOjM0XSAmIHllYXIgPiAxOTc5XSkgKwogIGxhYnMoeCA9ICJNZWFuIGJvdHRvbSB0ZW1wZXJhdHVyZSAoy5pDKSIsICB5ID0gIs6yLWRpdmVyc2l0eSIpICsKICBnZW9tX3BvaW50KGFlcyh4ID0gYXMubnVtZXJpYyh5ZWFybHlfbWVhbl9ieXBvaW50X2F2ZyksIHkgPSBhbm51YWxfZGlzc2ltaWxhcml0eV92YWx1ZSksIGFscGhhID0gMC4zKSArCiAgZ2VvbV9zbW9vdGgoYWVzKHggPSBhcy5udW1lcmljKHllYXJseV9tZWFuX2J5cG9pbnRfYXZnKSwgeSA9IGFubnVhbF9kaXNzaW1pbGFyaXR5X3ZhbHVlKSwgbWV0aG9kID0gImxtIikgKwogIGZhY2V0X3dyYXAoflN1cnZleV9OYW1lX1NlYXNvbiwgc2NhbGVzPSAiZnJlZSIsIG5jb2wgPSA0KSArCiAgdGhlbWVfY2xhc3NpYygpKQoKZ2dzYXZlKHByZWRzX3NidF9tZWFuX3RlbXBfc3VydmV5X2ZhY2V0XzIxXzM0LCBwYXRoID0gaGVyZTo6aGVyZSgiZmlndXJlcyIpLCBmaWxlbmFtZSA9ICJwcmVkc19zYnRfbWVhbl90ZW1wX3N1cnZleV9mYWNldF8yMV8zNC5qcGciLCBoZWlnaHQgPSAxMiwgd2lkdGggPTkpCgojIyMjI01JTklNVU0gVEVNUAoocHJlZHNfc2J0X21pbl90ZW1wX3N1cnZleV9mYWNldF8xXzIwIDwtIGdncGxvdChkYXRhID0gZGlzc2ltaWxhcml0aWVzX3RlbXBfZmlzaGluZ19hcmVhLmphY2NhcmRbc3VydmV5X3VuaXQgJWluJSBhbGxfc3VydmV5c1sxOjIwXSAmIHllYXIgPiAxOTc5XSkgKwogIGxhYnMoeCA9ICJNaW5pbXVtIGJvdHRvbSB0ZW1wZXJhdHVyZSAoy5pDKSIsICB5ID0gIs6yLWRpdmVyc2l0eSIpICsKICBnZW9tX3BvaW50KGFlcyh4ID0gYXMubnVtZXJpYyh5ZWFybHlfbWluX2J5cG9pbnRfYXZnKSwgeSA9IGFubnVhbF9kaXNzaW1pbGFyaXR5X3ZhbHVlKSwgYWxwaGEgPSAwLjMpICsKICBnZW9tX3Ntb290aChhZXMoeCA9IGFzLm51bWVyaWMoeWVhcmx5X21pbl9ieXBvaW50X2F2ZyksIHkgPSBhbm51YWxfZGlzc2ltaWxhcml0eV92YWx1ZSksIG1ldGhvZCA9ICJsbSIpICsKICBmYWNldF93cmFwKH5TdXJ2ZXlfTmFtZV9TZWFzb24sIHNjYWxlcz0gImZyZWUiLCBuY29sID0gNCkgKwogIHRoZW1lX2NsYXNzaWMoKSkKCmdnc2F2ZShwcmVkc19zYnRfbWluX3RlbXBfc3VydmV5X2ZhY2V0XzFfMjAsIHBhdGggPSBoZXJlOjpoZXJlKCJmaWd1cmVzIiksIGZpbGVuYW1lID0gInByZWRzX3NidF9taW5fdGVtcF9zdXJ2ZXlfZmFjZXRfMV8yMC5qcGciLCBoZWlnaHQgPSAxMiwgd2lkdGggPTkpCgoocHJlZHNfc2J0X21pbl90ZW1wX3N1cnZleV9mYWNldF8yMV8zNCA8LSBnZ3Bsb3QoZGF0YSA9IGRpc3NpbWlsYXJpdGllc190ZW1wX2Zpc2hpbmdfYXJlYS5qYWNjYXJkW3N1cnZleV91bml0ICVpbiUgYWxsX3N1cnZleXNbMjE6MzRdICYgeWVhciA+IDE5NzldKSArCiAgbGFicyh4ID0gIk1pbmltdW0gYm90dG9tIHRlbXBlcmF0dXJlICjLmkMpIiwgIHkgPSAizrItZGl2ZXJzaXR5IikgKwogIGdlb21fcG9pbnQoYWVzKHggPSBhcy5udW1lcmljKHllYXJseV9taW5fYnlwb2ludF9hdmcpLCB5ID0gYW5udWFsX2Rpc3NpbWlsYXJpdHlfdmFsdWUpLCBhbHBoYSA9IDAuMykgKwogIGdlb21fc21vb3RoKGFlcyh4ID0gYXMubnVtZXJpYyh5ZWFybHlfbWluX2J5cG9pbnRfYXZnKSwgeSA9IGFubnVhbF9kaXNzaW1pbGFyaXR5X3ZhbHVlKSwgbWV0aG9kID0gImxtIikgKwogIGZhY2V0X3dyYXAoflN1cnZleV9OYW1lX1NlYXNvbiwgc2NhbGVzPSAiZnJlZSIsIG5jb2wgPSA0KSArCiAgdGhlbWVfY2xhc3NpYygpKQoKZ2dzYXZlKHByZWRzX3NidF9taW5fdGVtcF9zdXJ2ZXlfZmFjZXRfMjFfMzQsIHBhdGggPSBoZXJlOjpoZXJlKCJmaWd1cmVzIiksIGZpbGVuYW1lID0gInByZWRzX3NidF9taW5fdGVtcF9zdXJ2ZXlfZmFjZXRfMjFfMzQuanBnIiwgaGVpZ2h0ID0gMTIsIHdpZHRoID05KQoKIyMjIyMjI0ZJU0hJTkcKCmRpc3NpbWlsYXJpdGllc190ZW1wX2Zpc2hpbmdfYXJlYS5qYWNjYXJkLmNjIDwtIGRpc3NpbWlsYXJpdGllc190ZW1wX2Zpc2hpbmdfYXJlYS5qYWNjYXJkW2NvbXBsZXRlLmNhc2VzKGRpc3NpbWlsYXJpdGllc190ZW1wX2Zpc2hpbmdfYXJlYS5qYWNjYXJkWyxzdW1tZWRfdG9ubmVzX3NjYWxlZF9ieXJlZ10pLF0KCihwcmVkc19zYnRfbWVhbl9maXNoaW5nX3N1cnZleV9mYWNldF8xXzIwIDwtIGdncGxvdChkYXRhID0gZGlzc2ltaWxhcml0aWVzX3RlbXBfZmlzaGluZ19hcmVhLmphY2NhcmQuY2Nbc3VydmV5X3VuaXQgJWluJSBhbGxfc3VydmV5c1sxOjIwXSAmIHllYXIgPiAxOTc5XSkgKwogIGxhYnMoeCA9ICJSZWxhdGl2ZSBmaXNoaW5nIGNhdGNoIiwgIHkgPSAizrItZGl2ZXJzaXR5IikgKwogIGdlb21fcG9pbnQoYWVzKHggPSBzdW1tZWRfdG9ubmVzX3NjYWxlZF9ieXJlZywgeSA9IGFubnVhbF9kaXNzaW1pbGFyaXR5X3ZhbHVlKSwgYWxwaGEgPSAwLjMpICsKICBnZW9tX3Ntb290aChhZXMoeCA9IHN1bW1lZF90b25uZXNfc2NhbGVkX2J5cmVnLCB5ID0gYW5udWFsX2Rpc3NpbWlsYXJpdHlfdmFsdWUpLCBtZXRob2QgPSAibG0iKSArCiAgZmFjZXRfd3JhcCh+U3VydmV5X05hbWVfU2Vhc29uLCBzY2FsZXM9ICJmcmVlIiwgbmNvbCA9IDQpICsKICB0aGVtZV9jbGFzc2ljKCkpCgpnZ3NhdmUocHJlZHNfc2J0X21lYW5fZmlzaGluZ19zdXJ2ZXlfZmFjZXRfMV8yMCwgcGF0aCA9IGhlcmU6OmhlcmUoImZpZ3VyZXMiKSwgZmlsZW5hbWUgPSAicHJlZHNfc2J0X21lYW5fZmlzaGluZ19zdXJ2ZXlfZmFjZXRfMV8yMC5qcGciLCBoZWlnaHQgPSAxMiwgd2lkdGggPTkpCgoocHJlZHNfc2J0X21lYW5fZmlzaGluZ19zdXJ2ZXlfZmFjZXRfMjFfMzQgPC0gZ2dwbG90KGRhdGEgPSBkaXNzaW1pbGFyaXRpZXNfdGVtcF9maXNoaW5nX2FyZWEuamFjY2FyZC5jY1tzdXJ2ZXlfdW5pdCAlaW4lIGFsbF9zdXJ2ZXlzW2MoMjE6MzQpXSAmIHllYXIgPiAxOTc5XSkgKwogIGxhYnMoeCA9ICJSZWxhdGl2ZSBmaXNoaW5nIGNhdGNoIiwgIHkgPSAizrItZGl2ZXJzaXR5IikgKwogIGdlb21fcG9pbnQoYWVzKHggPSBzdW1tZWRfdG9ubmVzX3NjYWxlZF9ieXJlZywgeSA9IGFubnVhbF9kaXNzaW1pbGFyaXR5X3ZhbHVlKSwgYWxwaGEgPSAwLjMpICsKICBnZW9tX3Ntb290aChhZXMoeCA9IHN1bW1lZF90b25uZXNfc2NhbGVkX2J5cmVnLCB5ID0gYW5udWFsX2Rpc3NpbWlsYXJpdHlfdmFsdWUpLCBtZXRob2QgPSAibG0iKSArCiAgZmFjZXRfd3JhcCh+U3VydmV5X05hbWVfU2Vhc29uLCBzY2FsZXM9ICJmcmVlIiwgbmNvbCA9IDQpICsKICB0aGVtZV9jbGFzc2ljKCkpCgpnZ3NhdmUocHJlZHNfc2J0X21lYW5fZmlzaGluZ19zdXJ2ZXlfZmFjZXRfMjFfMzQsIHBhdGggPSBoZXJlOjpoZXJlKCJmaWd1cmVzIiksIGZpbGVuYW1lID0gInByZWRzX3NidF9tZWFuX2Zpc2hpbmdfc3VydmV5X2ZhY2V0XzIxXzM0LmpwZyIsIGhlaWdodCA9IDEyLCB3aWR0aCA9OSkKCgpgYGAKCiMjI1Bsb3QgbnVtYmVyIG9mIHRvd3MgcGVyIHllYXIgcGVyIHJlZ2lvbgpgYGB7cn0KdG93c195ZWFyIDwtIHVuaXF1ZShkaXNzaW1pbGFyaXRpZXNfdGVtcF9maXNoaW5nX2FyZWEuamFjY2FyZFssLihzdXJ2ZXlfdW5pdCwgaGF1bF9pZF9jb3VudF9hbm51YWwsIGFyZWFfa20sIHllYXIsIFN1cnZleV9OYW1lX1NlYXNvbildKQoKbWluX2hhdWxfZGVuc2l0eSA8LSBtaW4odG93c195ZWFyJGhhdWxfaWRfY291bnRfYW5udWFsL3Rvd3NfeWVhciRhcmVhX2ttKQptYXhfaGF1bF9kZW5zaXR5IDwtIG1heCh0b3dzX3llYXIkaGF1bF9pZF9jb3VudF9hbm51YWwvdG93c195ZWFyJGFyZWFfa20pCgoodG93X2RlbnNpdHlfc3VydmV5X2ZhY2V0XzFfMjAgPC0gZ2dwbG90KGRhdGEgPSB0b3dzX3llYXJbc3VydmV5X3VuaXQgJWluJSBhbGxfc3VydmV5c1sxOjIwXV0pICsKICBsYWJzKHggPSAiWWVhciIsICB5ID0gZXhwcmVzc2lvbigiVG93IGRlbnNpdHkgKHRvd3MgcGVyIGttIl4yKiIpIikpICsKICBnZW9tX3BvaW50KGFlcyh4ID0geWVhciwgeSA9IGhhdWxfaWRfY291bnRfYW5udWFsL2FyZWFfa20pKSArCiAgeWxpbShjKG1pbl9oYXVsX2RlbnNpdHktMC4wMDAxLCBtYXhfaGF1bF9kZW5zaXR5KzAuMDAwMSkpICsKICBmYWNldF93cmFwKH5TdXJ2ZXlfTmFtZV9TZWFzb24sIG5jb2wgPSA0KSArCiAgdGhlbWVfY2xhc3NpYygpKQoKZ2dzYXZlKHRvd19kZW5zaXR5X3N1cnZleV9mYWNldF8xXzIwLCBwYXRoID0gaGVyZTo6aGVyZSgiZmlndXJlcyIpLCBmaWxlbmFtZSA9ICJ0b3dfZGVuc2l0eV9zdXJ2ZXlfZmFjZXRfMV8yMC5qcGciLCBoZWlnaHQgPSAxMiwgd2lkdGggPTkpCgoodG93X2RlbnNpdHlfc3VydmV5X2ZhY2V0XzIxXzM0IDwtIGdncGxvdChkYXRhID0gdG93c195ZWFyW3N1cnZleV91bml0ICVpbiUgYWxsX3N1cnZleXNbMjE6MzRdXSkgKwogIGxhYnMoeCA9ICJZZWFyIiwgIHkgPSBleHByZXNzaW9uKCJUb3cgZGVuc2l0eSAodG93cyBwZXIga20iXjIqIikiKSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSB5ZWFyLCB5ID0gaGF1bF9pZF9jb3VudF9hbm51YWwvYXJlYV9rbSkpICsKICB5bGltKGMobWluX2hhdWxfZGVuc2l0eS0wLjAwMDEsIG1heF9oYXVsX2RlbnNpdHkrMC4wMDAxKSkgKwogIGZhY2V0X3dyYXAoflN1cnZleV9OYW1lX1NlYXNvbiwgbmNvbCA9IDQpICsKICB0aGVtZV9jbGFzc2ljKCkpCgpnZ3NhdmUodG93X2RlbnNpdHlfc3VydmV5X2ZhY2V0XzIxXzM0LCBwYXRoID0gaGVyZTo6aGVyZSgiZmlndXJlcyIpLCBmaWxlbmFtZSA9ICJ0b3dfZGVuc2l0eV9zdXJ2ZXlfZmFjZXRfMjFfMzQuanBnIiwgaGVpZ2h0ID0gMTIsIHdpZHRoID05KQoKI21pbmltdW0gYW5kIG1heGltdW0gZGlzc2ltaWxhcml0eSB2YWx1ZQptaW5fZGlzc2ltaWxhcml0eSA8LSBtaW4oZGlzc2ltaWxhcml0aWVzX3RlbXBfZmlzaGluZ19hcmVhLmphY2NhcmQkYW5udWFsX2Rpc3NpbWlsYXJpdHlfdmFsdWUpCm1heF9kaXNzaW1pbGFyaXR5IDwtIG1heChkaXNzaW1pbGFyaXRpZXNfdGVtcF9maXNoaW5nX2FyZWEuamFjY2FyZCRhbm51YWxfZGlzc2ltaWxhcml0eV92YWx1ZSkKCiNob3cgZG9lcyB0b3cgZGVuc2l0eSB2YXJ5IHdpdGggZGlzc2ltaWxhcml0eT8KdG93X2RlbnNpdHlfZGlzc2ltaWxhcml0eV8xXzIwIDwtIAogIGdncGxvdChkYXRhID0gZGlzc2ltaWxhcml0aWVzX3RlbXBfZmlzaGluZ19hcmVhLmphY2NhcmRbZGlzc2ltaWxhcml0eV9tZXRyaWMgPT0gImphY2NhcmRfZGlzc2ltaWxhcml0eV9pbmRleF9iaW5hcnkiICYgc3VydmV5X3VuaXQgJWluJSBhbGxfc3VydmV5c1sxOjIwXV0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gKGhhdWxfaWRfY291bnRfYW5udWFsL2FyZWFfa20pLCB5ID0gYW5udWFsX2Rpc3NpbWlsYXJpdHlfdmFsdWUsIGNvbG9yID0geWVhciksIHNpemUgPSAyKSArCiAgdmlyaWRpczo6c2NhbGVfY29sb3JfdmlyaWRpcygpICsKICBmYWNldF93cmFwKH5TdXJ2ZXlfTmFtZV9TZWFzb24sIG5jb2wgPSA0LCBzY2FsZXMgPSAiZnJlZSIpICsKICBsYWJzKHggPSBleHByZXNzaW9uKCJUb3cgZGVuc2l0eSAodG93cyBwZXIga20iXjIqIikiKSwgeSA9ICLOsi1kaXZlcnNpdHkiLCBjb2xvciA9ICJZZWFyIikgKwogICAjIHhsaW0oYyhtaW5faGF1bF9kZW5zaXR5LTAuMDAwMSwgbWF4X2hhdWxfZGVuc2l0eSswLjAwMDEpKSArCiAgICMgeWxpbShjKG1pbl9kaXNzaW1pbGFyaXR5LTAuMDEsbWF4X2Rpc3NpbWlsYXJpdHkrMC4wMSkpICsKICB0aGVtZV9jbGFzc2ljKCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIHZqdXN0ID0gMC41LCBoanVzdCA9IDEpKQoKZ2dzYXZlKHRvd19kZW5zaXR5X2Rpc3NpbWlsYXJpdHlfMV8yMCwgcGF0aCA9IGhlcmU6OmhlcmUoImZpZ3VyZXMiKSwgZmlsZW5hbWUgPSAidG93X2RlbnNpdHlfZGlzc2ltaWxhcml0eV8xXzIwLmpwZyIsIGhlaWdodCA9IDEyLCB3aWR0aCA9OSkKCnRvd19kZW5zaXR5X2Rpc3NpbWlsYXJpdHlfMjFfMzQgPC0gCiAgZ2dwbG90KGRhdGEgPSBkaXNzaW1pbGFyaXRpZXNfdGVtcF9maXNoaW5nX2FyZWEuamFjY2FyZFtkaXNzaW1pbGFyaXR5X21ldHJpYyA9PSAiamFjY2FyZF9kaXNzaW1pbGFyaXR5X2luZGV4X2JpbmFyeSIgJiBzdXJ2ZXlfdW5pdCAlaW4lIGFsbF9zdXJ2ZXlzWzIxOjM0XV0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gKGhhdWxfaWRfY291bnRfYW5udWFsL2FyZWFfa20pLCB5ID0gYW5udWFsX2Rpc3NpbWlsYXJpdHlfdmFsdWUsIGNvbG9yID0geWVhciksIHNpemUgPSAyKSArCiAgdmlyaWRpczo6c2NhbGVfY29sb3JfdmlyaWRpcygpICsKICBmYWNldF93cmFwKH5TdXJ2ZXlfTmFtZV9TZWFzb24sIG5jb2wgPSA0LCBzY2FsZXMgPSAiZnJlZSIpICsKICBsYWJzKHggPSBleHByZXNzaW9uKCJUb3cgZGVuc2l0eSAodG93cyBwZXIga20iXjIqIikiKSwgeSA9ICLOsi1kaXZlcnNpdHkiLCBjb2xvciA9ICJZZWFyIikgKwogICAjIHhsaW0oYyhtaW5faGF1bF9kZW5zaXR5LTAuMDAwMSwgbWF4X2hhdWxfZGVuc2l0eSswLjAwMDEpKSArCiAgICMgeWxpbShjKG1pbl9kaXNzaW1pbGFyaXR5LTAuMDEsbWF4X2Rpc3NpbWlsYXJpdHkrMC4wMSkpICsKICB0aGVtZV9jbGFzc2ljKCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIHZqdXN0ID0gMC41LCBoanVzdCA9IDEpKQoKZ2dzYXZlKHRvd19kZW5zaXR5X2Rpc3NpbWlsYXJpdHlfMjFfMzQsIHBhdGggPSBoZXJlOjpoZXJlKCJmaWd1cmVzIiksIGZpbGVuYW1lID0gInRvd19kZW5zaXR5X2Rpc3NpbWlsYXJpdHlfMjFfMzQuanBnIiwgaGVpZ2h0ID0gMTIsIHdpZHRoID05KQoKCiNQbG90IGFsbCBhdCBvbmNlPwp0b3dfZGVuc2l0eV9kaXNzaW1pbGFyaXR5IDwtIAogIGdncGxvdChkYXRhID0gZGlzc2ltaWxhcml0aWVzX3RlbXBfZmlzaGluZ19hcmVhLmphY2NhcmRbZGlzc2ltaWxhcml0eV9tZXRyaWMgPT0gImphY2NhcmRfZGlzc2ltaWxhcml0eV9pbmRleF9iaW5hcnkiXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSAoaGF1bF9pZF9jb3VudF9hbm51YWwvYXJlYV9rbSksIHkgPSBhbm51YWxfZGlzc2ltaWxhcml0eV92YWx1ZSwgY29sb3IgPSBTdXJ2ZXlfTmFtZV9TZWFzb24pLCBzaXplID0gMikgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjb2xvcl9saW5rJGhleCkgKwogIGxhYnMoeCA9IGV4cHJlc3Npb24oIlRvdyBkZW5zaXR5ICh0b3dzIHBlciBrbSJeMioiKSIpLCB5ID0gIs6yLWRpdmVyc2l0eSIsIGNvbG9yID0gIlllYXIiKSArCiAgICMgeGxpbShjKG1pbl9oYXVsX2RlbnNpdHktMC4wMDAxLCBtYXhfaGF1bF9kZW5zaXR5KzAuMDAwMSkpICsKICAgIyB5bGltKGMobWluX2Rpc3NpbWlsYXJpdHktMC4wMSxtYXhfZGlzc2ltaWxhcml0eSswLjAxKSkgKwogIHRoZW1lX2NsYXNzaWMoKQoKI2FuZCBieSBudW1iZXJzPwpyZXN1bHQgPC0gZGlzc2ltaWxhcml0aWVzX3RlbXBfZmlzaGluZ19hcmVhLmphY2NhcmRbLCAuKG1heF9kZW5zaXR5ID0gbWF4KGhhdWxfaWRfY291bnRfYW5udWFsL2FyZWFfa20sIG5hLnJtID0gVFJVRSksIAogICAgICAgICAgICAgICAgIG1pbl9kZW5zaXR5ID0gbWluKGhhdWxfaWRfY291bnRfYW5udWFsL2FyZWFfa20sIG5hLnJtID0gVFJVRSkpLCAKICAgICAgICAgICAgIGJ5ID0gU3VydmV5X05hbWVfU2Vhc29uXQoKcmVzdWx0WyxyYW5nZTo9IG1heF9kZW5zaXR5LW1pbl9kZW5zaXR5XQoKZ2dwbG90KGRhdGEgPSByZXN1bHQpICsKICBnZW9tX3BvaW50KGFlcyh4ID0gU3VydmV5X05hbWVfU2Vhc29uLCB5ID0gcmFuZ2UpKSArCiAgdGhlbWVfY2xhc3NpYygpICsKICBsYWJzKHggPSAiIix5ID0gIlJhbmdlIG9mIHRvdyBkZW5zaXR5IHZhbHVlcyBpbiB0b3cva21eMiIpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdD0xKSkKCmBgYAoKUGxvdCBkaXNzaW1pbGFyaXR5IGJ5IHNlYXNvbiBvZiBzYW1wbGluZwpgYGB7cn0KZGlzc2ltaWxhcml0aWVzX3RlbXBfZmlzaGluZ19hcmVhLmphY2NhcmRbLHNlYXNvbiA6PSBmYWN0b3Ioc2Vhc29uLCBsZXZlbHMgPSBjKCJTcHJpbmciLCJTdW1tZXIiLCJGYWxsIiwiV2ludGVyIikpXQoKZ2dwbG90KGRpc3NpbWlsYXJpdGllc190ZW1wX2Zpc2hpbmdfYXJlYS5qYWNjYXJkKSArCiAgZ2VvbV9ib3hwbG90KGFlcyh4ID0gc2Vhc29uLCB5ID0gYW5udWFsX2Rpc3NpbWlsYXJpdHlfdmFsdWUpKSArCiAgdGhlbWVfY2xhc3NpYygpCmBgYAoKCgojIyNTZXQgdXAgZHJlZGdlIHRvIGlkZW50aWZ5IGJlc3QgcGVyZm9ybWluZyBtb2RlbHMKCkZpcnN0LCBtYWtlIGRhdGEgdGFibGUgb2YgbW9kZWwgY292YXJpYXRlcwpgYGB7cn0KCm9wdGlvbnMobmEuYWN0aW9uID0gIm5hLmZhaWwiKQoKZGlzc2ltaWxhcml0eV9jb3ZhcmlhdGVzX2RyZWRnZS5kdCA8LSBkaXNzaW1pbGFyaXRpZXNfdGVtcF9maXNoaW5nX2FyZWEuamFjY2FyZFssLgogICAgICAgICAgICAgICAgICAoeWVhciwgc3VydmV5X3VuaXQsCiAgICAgICAgICAgICAgICAgICAgeWVhcmx5X21lYW5fYnlwb2ludF9hdmcsIHllYXJseV9tYXhfYnlwb2ludF9hdmcsIHllYXJseV9taW5fYnlwb2ludF9hdmcseWVhcmx5X3NlYXNfYnlwb2ludF9hdmcsCiAgICAgICAgICAgICAgICAgICAgeWVhcmx5X21lYW5fYnlwb2ludF9TRCwgeWVhcmx5X21heF9ieXBvaW50X1NELCB5ZWFybHlfbWluX2J5cG9pbnRfU0QseWVhcmx5X3NlYXNfYnlwb2ludF9TRCwKICAgICAgICAgICAgICAgICAgICB5ZWFybHlfbWVhbl9ieXBvaW50X2F2Zy5zLCB5ZWFybHlfbWF4X2J5cG9pbnRfYXZnLnMsIHllYXJseV9taW5fYnlwb2ludF9hdmcucyx5ZWFybHlfc2Vhc19ieXBvaW50X2F2Zy5zLAogICAgICAgICAgICAgICAgICAgIGFubnVhbF9kaXNzaW1pbGFyaXR5X3ZhbHVlLAogICAgICAgICAgICAgICAgICAgIGhhdWxfaWRfY291bnRfYW5udWFsLAogICAgICAgICAgICAgICAgICAgIHNwcF9jb3VudF9hbm51YWwsIGRlcHRoX2FubnVhbF9hdmcsCiAgICAgICAgICAgICAgICAgICAgZGVwdGhfYW5udWFsX3JhbmdlLCBsYXRpdHVkZV9hbm51YWxfYXZnLAogICAgICAgICAgICAgICAgICAgIGxhdGl0dWRlX2FubnVhbF9yYW5nZSwgYXJlYV9rbSwgc2Vhc29uLCBzdW1tZWRfdG9ubmVzX3NjYWxlZF9ieXJlZyldCgojbWVyZ2UgaW4gd2l0aCBjb2xvcnMgZm9yIHBsb3R0aW5nIHByZWRpY3Rpb25zIGJ5IHN1cnZleQpkaXNzaW1pbGFyaXR5X2NvdmFyaWF0ZXNfZHJlZGdlLmR0IDwtIGNvbG9yX2xpbmtbZGlzc2ltaWxhcml0eV9jb3ZhcmlhdGVzX2RyZWRnZS5kdCwgb24gPSAic3VydmV5X3VuaXQiXQoKI0lmIE5BIGZvciBhbnkgY292YXJpYXRlLCBkZWxldGUgcm93CiNWaWV3KGRpc3NpbWlsYXJpdHlfY292YXJpYXRlc19kcmVkZ2UuZHQpCiNEZWxldGVkOgogICNCZWZvcmUgMTk4MCBhbmQgYWZ0ZXIgMjAxOQogICNHdWxmIG9mIFNhaW50IExhdXJlbmNlIFNvdXRoIChubyBkZXB0aCBkYXRhKQogICNObyBjbGVhciBTQVUgbWF0Y2ggZm9yIFJvY2thbGwgUGxhdGVhdQpkaXNzaW1pbGFyaXR5X2NvdmFyaWF0ZXNfZHJlZGdlLmR0IDwtIGRpc3NpbWlsYXJpdHlfY292YXJpYXRlc19kcmVkZ2UuZHRbY29tcGxldGUuY2FzZXMoZGlzc2ltaWxhcml0eV9jb3ZhcmlhdGVzX2RyZWRnZS5kdCldCgojU2NhbGUgYW5kIGNlbnRlciB2YXJpYWJsZXMgdGhhdCBhcmUgbm90IHlldCBzY2FsZWQgYW5kIGNlbnRlcmVkCmRpc3NpbWlsYXJpdHlfY292YXJpYXRlc19kcmVkZ2UuZHRbLCB5ZWFybHlfbWVhbl9ieXBvaW50X2F2Zy5zY2FsZWRhY3Jvc3NhbGwgOj0gc2NhbGUoeWVhcmx5X21lYW5fYnlwb2ludF9hdmcpXVssIHllYXJseV9tZWFuX2J5cG9pbnRfU0Quc2NhbGVkYWNyb3NzYWxsIDo9IHNjYWxlKHllYXJseV9tZWFuX2J5cG9pbnRfU0QpXVssIHllYXJseV9taW5fYnlwb2ludF9hdmcuc2NhbGVkYWNyb3NzYWxsIDo9IHNjYWxlKHllYXJseV9taW5fYnlwb2ludF9hdmcpXVssIHllYXJseV9tYXhfYnlwb2ludF9hdmcuc2NhbGVkYWNyb3NzYWxsIDo9IHNjYWxlKHllYXJseV9tYXhfYnlwb2ludF9hdmcpXVssIHllYXJseV9zZWFzX2J5cG9pbnRfYXZnLnNjYWxlZGFjcm9zc2FsbCA6PSBzY2FsZSh5ZWFybHlfc2Vhc19ieXBvaW50X2F2ZyldWyxoYXVsX2lkX2NvdW50X2FubnVhbC5zY2FsZWRhY3Jvc3NhbGwgOj0gc2NhbGUoaGF1bF9pZF9jb3VudF9hbm51YWwpXVssc3BwX2NvdW50X2FubnVhbC5zY2FsZWRhY3Jvc3NhbGwgOj0gc2NhbGUoc3BwX2NvdW50X2FubnVhbCldWyxkZXB0aF9hbm51YWxfYXZnLnNjYWxlZGFjcm9zc2FsbCA6PSBzY2FsZShkZXB0aF9hbm51YWxfYXZnKV1bLGRlcHRoX2FubnVhbF9yYW5nZS5zY2FsZWRhY3Jvc3NhbGwgOj0gc2NhbGUoZGVwdGhfYW5udWFsX3JhbmdlKV0gWyxsYXRpdHVkZV9hbm51YWxfYXZnLnNjYWxlZGFjcm9zc2FsbCA6PSBzY2FsZShsYXRpdHVkZV9hbm51YWxfYXZnKV1bLGxhdGl0dWRlX2FubnVhbF9yYW5nZS5zY2FsZWRhY3Jvc3NhbGwgOj0gc2NhbGUobGF0aXR1ZGVfYW5udWFsX3JhbmdlKV1bLGFyZWFfa20uc2NhbGVkYWNyb3NzYWxsIDo9IHNjYWxlKGFyZWFfa20pXQoKCmBgYAoKIyMjI0dsb2JhbCBtb2RlbCBjb250ZW5kZXJzCn4gdGVtcCAqIHN1cnZleV91bml0ICsgZmlzaGluZyAqIHN1cnZleV91bml0ICsgYXJlYSArIGxhdGl0dWRlIHJhbmdlICsgbGF0aXR1ZGUgYXZlcmFnZSArIGRlcHRoIHJhbmdlICsgZGVwdGggYXZlcmFnZSArIHNwcCBjb3VudCArICMgb2YgaGF1bHMgKyBzZWFzb24gKyBBUiBmb3IgeWVhciAob3B0aW9uYWwsIHdpbGwgc2VlIGlmIHRoaXMgcGVyZm9ybXMgYmV0dGVyIG9yIHdvcnNlIHdpdGggQVIxKQoKRm9yIHRlbXBlcmF0dXJlLCB3ZSB3aWxsIGNvbXBhcmUgcGVyZm9ybWFuY2Ugb2Y6Ci1tZWFuIChzY2FsZWQgYWNyb3NzIGFsbCByZWdpb25zKQotbWF4ICAoc2NhbGVkIGFjcm9zcyBhbGwgcmVnaW9ucykKLW1pbiAoc2NhbGVkIGFjcm9zcyBhbGwgcmVnaW9ucykKLXNlYXMgIChzY2FsZWQgYWNyb3NzIGFsbCByZWdpb25zKQotU0QgKHNjYWxlZCBhY3Jvc3MgYWxsIHJlZ2lvbnMpCgpDb21wYXJpbmcgdGVtcCB2YXJpYWJsZXMgQU5EIHRoZSBwcmVzZW5jZS9hYnNlbmNlIG9mIGEgdGVtcG9yYWwgYXV0b2NvcnJlbGF0aW9uIHRlcm0KYGBge3IgZml0IGdsb2JhbCBtb2R9CgojbWVhbiB0ZW1wZXJhdHVyZQpnbG9iYWxfbW9kX21lYW5fdGVtcF9sbSA8LSBsbShhbm51YWxfZGlzc2ltaWxhcml0eV92YWx1ZSB+IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cnZleV91bml0KnllYXJseV9tZWFuX2J5cG9pbnRfYXZnLnNjYWxlZGFjcm9zc2FsbCArICN0ZW1wIGFuZCBzdXJ2ZXkgdW5pdCAocG9zc2libGUgaW50ZXJhY3Rpb24pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VydmV5X3VuaXQqc3VtbWVkX3Rvbm5lc19zY2FsZWRfYnlyZWcgKyAjZmlzaGluZyBlZmZvcnQgYW5kIHN1cnZleSB1bml0IChwb3NzaWJsZSBpbnRlcmFjdGlvbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmVhX2ttLnNjYWxlZGFjcm9zc2FsbCArICNhcmVhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0aXR1ZGVfYW5udWFsX3JhbmdlLnNjYWxlZGFjcm9zc2FsbCArICNsYXRpdHVkZSByYW5nZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGl0dWRlX2FubnVhbF9hdmcuc2NhbGVkYWNyb3NzYWxsICsgI2xhdGl0dWRlIGF2ZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoX2FubnVhbF9yYW5nZS5zY2FsZWRhY3Jvc3NhbGwgKyAjZGVwdGggcmFuZ2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aF9hbm51YWxfYXZnLnNjYWxlZGFjcm9zc2FsbCArICNkZXB0aCBhdmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHBfY291bnRfYW5udWFsLnNjYWxlZGFjcm9zc2FsbCArICNzcHAgIwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhdWxfaWRfY291bnRfYW5udWFsLnNjYWxlZGFjcm9zc2FsbCArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vhc29uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkaXNzaW1pbGFyaXR5X2NvdmFyaWF0ZXNfZHJlZGdlLmR0KQoKI3dpdGggdGVtcG9yYWwgYXV0b2NvcnJlbGF0aW9uCmdsb2JhbF9tb2RfbWVhbl90ZW1wX2dscyA8LSBnbHMoYW5udWFsX2Rpc3NpbWlsYXJpdHlfdmFsdWUgfiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJ2ZXlfdW5pdCp5ZWFybHlfbWVhbl9ieXBvaW50X2F2Zy5zY2FsZWRhY3Jvc3NhbGwgKyAjdGVtcCBhbmQgc3VydmV5IHVuaXQgKHBvc3NpYmxlIGludGVyYWN0aW9uKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cnZleV91bml0KnN1bW1lZF90b25uZXNfc2NhbGVkX2J5cmVnICsgI2Zpc2hpbmcgZWZmb3J0IGFuZCBzdXJ2ZXkgdW5pdCAocG9zc2libGUgaW50ZXJhY3Rpb24pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlYV9rbS5zY2FsZWRhY3Jvc3NhbGwgKyAjYXJlYQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGl0dWRlX2FubnVhbF9yYW5nZS5zY2FsZWRhY3Jvc3NhbGwgKyAjbGF0aXR1ZGUgcmFuZ2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRpdHVkZV9hbm51YWxfYXZnLnNjYWxlZGFjcm9zc2FsbCArICNsYXRpdHVkZSBhdmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aF9hbm51YWxfcmFuZ2Uuc2NhbGVkYWNyb3NzYWxsICsgI2RlcHRoIHJhbmdlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGhfYW5udWFsX2F2Zy5zY2FsZWRhY3Jvc3NhbGwgKyAjZGVwdGggYXZnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BwX2NvdW50X2FubnVhbC5zY2FsZWRhY3Jvc3NhbGwgKyAjc3BwICMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXVsX2lkX2NvdW50X2FubnVhbC5zY2FsZWRhY3Jvc3NhbGwgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vhc29uLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbiA9IGNvckFSMShmb3JtPX55ZWFyIHwgc3VydmV5X3VuaXQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkaXNzaW1pbGFyaXR5X2NvdmFyaWF0ZXNfZHJlZGdlLmR0KQojbWF4aW11bSB0ZW1wZXJhdHVyZQpnbG9iYWxfbW9kX21heF90ZW1wX2xtIDwtIGxtKGFubnVhbF9kaXNzaW1pbGFyaXR5X3ZhbHVlIH4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VydmV5X3VuaXQqeWVhcmx5X21heF9ieXBvaW50X2F2Zy5zY2FsZWRhY3Jvc3NhbGwgKyAjdGVtcCBhbmQgc3VydmV5IHVuaXQgKHBvc3NpYmxlIGludGVyYWN0aW9uKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cnZleV91bml0KnN1bW1lZF90b25uZXNfc2NhbGVkX2J5cmVnICsgI2Zpc2hpbmcgZWZmb3J0IGFuZCBzdXJ2ZXkgdW5pdCAocG9zc2libGUgaW50ZXJhY3Rpb24pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlYV9rbS5zY2FsZWRhY3Jvc3NhbGwgKyAjYXJlYQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGl0dWRlX2FubnVhbF9yYW5nZS5zY2FsZWRhY3Jvc3NhbGwgKyAjbGF0aXR1ZGUgcmFuZ2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRpdHVkZV9hbm51YWxfYXZnLnNjYWxlZGFjcm9zc2FsbCArICNsYXRpdHVkZSBhdmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aF9hbm51YWxfcmFuZ2Uuc2NhbGVkYWNyb3NzYWxsICsgI2RlcHRoIHJhbmdlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGhfYW5udWFsX2F2Zy5zY2FsZWRhY3Jvc3NhbGwgKyAjZGVwdGggYXZnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BwX2NvdW50X2FubnVhbC5zY2FsZWRhY3Jvc3NhbGwgKyAjc3BwICMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXVsX2lkX2NvdW50X2FubnVhbC5zY2FsZWRhY3Jvc3NhbGwgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vhc29uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkaXNzaW1pbGFyaXR5X2NvdmFyaWF0ZXNfZHJlZGdlLmR0KQoKI3dpdGggdGVtcG9yYWwgYXV0b2NvcnJlbGF0aW9uCmdsb2JhbF9tb2RfbWF4X3RlbXBfZ2xzIDwtZ2xzKGFubnVhbF9kaXNzaW1pbGFyaXR5X3ZhbHVlIH4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VydmV5X3VuaXQqeWVhcmx5X21heF9ieXBvaW50X2F2Zy5zY2FsZWRhY3Jvc3NhbGwgKyAjdGVtcCBhbmQgc3VydmV5IHVuaXQgKHBvc3NpYmxlIGludGVyYWN0aW9uKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cnZleV91bml0KnN1bW1lZF90b25uZXNfc2NhbGVkX2J5cmVnICsgI2Zpc2hpbmcgZWZmb3J0IGFuZCBzdXJ2ZXkgdW5pdCAocG9zc2libGUgaW50ZXJhY3Rpb24pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlYV9rbS5zY2FsZWRhY3Jvc3NhbGwgKyAjYXJlYQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGl0dWRlX2FubnVhbF9yYW5nZS5zY2FsZWRhY3Jvc3NhbGwgKyAjbGF0aXR1ZGUgcmFuZ2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRpdHVkZV9hbm51YWxfYXZnLnNjYWxlZGFjcm9zc2FsbCArICNsYXRpdHVkZSBhdmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aF9hbm51YWxfcmFuZ2Uuc2NhbGVkYWNyb3NzYWxsICsgI2RlcHRoIHJhbmdlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGhfYW5udWFsX2F2Zy5zY2FsZWRhY3Jvc3NhbGwgKyAjZGVwdGggYXZnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BwX2NvdW50X2FubnVhbC5zY2FsZWRhY3Jvc3NhbGwgKyAjc3BwICMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXVsX2lkX2NvdW50X2FubnVhbC5zY2FsZWRhY3Jvc3NhbGwgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vhc29uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb24gPSBjb3JBUjEoZm9ybT1+eWVhciB8IHN1cnZleV91bml0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGlzc2ltaWxhcml0eV9jb3ZhcmlhdGVzX2RyZWRnZS5kdCkKI21pbmltdW0gdGVtcGVyYXR1cmUKZ2xvYmFsX21vZF9taW5fdGVtcF9sbSA8LSBsbShhbm51YWxfZGlzc2ltaWxhcml0eV92YWx1ZSB+IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cnZleV91bml0KnllYXJseV9taW5fYnlwb2ludF9hdmcuc2NhbGVkYWNyb3NzYWxsICsgI3RlbXAgYW5kIHN1cnZleSB1bml0IChwb3NzaWJsZSBpbnRlcmFjdGlvbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJ2ZXlfdW5pdCpzdW1tZWRfdG9ubmVzX3NjYWxlZF9ieXJlZyArICNmaXNoaW5nIGVmZm9ydCBhbmQgc3VydmV5IHVuaXQgKHBvc3NpYmxlIGludGVyYWN0aW9uKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZWFfa20uc2NhbGVkYWNyb3NzYWxsICsgI2FyZWEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRpdHVkZV9hbm51YWxfcmFuZ2Uuc2NhbGVkYWNyb3NzYWxsICsgI2xhdGl0dWRlIHJhbmdlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0aXR1ZGVfYW5udWFsX2F2Zy5zY2FsZWRhY3Jvc3NhbGwgKyAjbGF0aXR1ZGUgYXZnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGhfYW5udWFsX3JhbmdlLnNjYWxlZGFjcm9zc2FsbCArICNkZXB0aCByYW5nZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoX2FubnVhbF9hdmcuc2NhbGVkYWNyb3NzYWxsICsgI2RlcHRoIGF2ZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcF9jb3VudF9hbm51YWwuc2NhbGVkYWNyb3NzYWxsICsgI3NwcCAjCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGF1bF9pZF9jb3VudF9hbm51YWwuc2NhbGVkYWNyb3NzYWxsICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXNvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGlzc2ltaWxhcml0eV9jb3ZhcmlhdGVzX2RyZWRnZS5kdCkKCmRpc3NpbWlsYXJpdHlfY292YXJpYXRlc19kcmVkZ2UuZHRbLCBzdXJ2ZXlfdW5pdCA6PSBmYWN0b3Ioc3VydmV5X3VuaXQsIGxldmVscyA9IHNvcnQoYWxsX3N1cnZleXMpKV0KCiN3aXRoIHRlbXBvcmFsIGF1dG9jb3JyZWxhdGlvbgpnbG9iYWxfbW9kX21pbl90ZW1wX2dscyA8LWdscyhhbm51YWxfZGlzc2ltaWxhcml0eV92YWx1ZSB+IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cnZleV91bml0KnllYXJseV9taW5fYnlwb2ludF9hdmcuc2NhbGVkYWNyb3NzYWxsICsgI3RlbXAgYW5kIHN1cnZleSB1bml0IChwb3NzaWJsZSBpbnRlcmFjdGlvbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJ2ZXlfdW5pdCpzdW1tZWRfdG9ubmVzX3NjYWxlZF9ieXJlZyArICNmaXNoaW5nIGVmZm9ydCBhbmQgc3VydmV5IHVuaXQgKHBvc3NpYmxlIGludGVyYWN0aW9uKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZWFfa20uc2NhbGVkYWNyb3NzYWxsICsgI2FyZWEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRpdHVkZV9hbm51YWxfcmFuZ2Uuc2NhbGVkYWNyb3NzYWxsICsgI2xhdGl0dWRlIHJhbmdlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0aXR1ZGVfYW5udWFsX2F2Zy5zY2FsZWRhY3Jvc3NhbGwgKyAjbGF0aXR1ZGUgYXZnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGhfYW5udWFsX3JhbmdlLnNjYWxlZGFjcm9zc2FsbCArICNkZXB0aCByYW5nZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoX2FubnVhbF9hdmcuc2NhbGVkYWNyb3NzYWxsICsgI2RlcHRoIGF2ZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcF9jb3VudF9hbm51YWwuc2NhbGVkYWNyb3NzYWxsICsgI3NwcCAjCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGF1bF9pZF9jb3VudF9hbm51YWwuc2NhbGVkYWNyb3NzYWxsICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXNvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uID0gY29yQVIxKGZvcm09fnllYXIgfCBzdXJ2ZXlfdW5pdCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRpc3NpbWlsYXJpdHlfY292YXJpYXRlc19kcmVkZ2UuZHQpCgojdGVtcGVyYXR1cmUgc2Vhc29uYWxpdHkKZ2xvYmFsX21vZF9zZWFzX3RlbXBfbG0gPC0gbG0oYW5udWFsX2Rpc3NpbWlsYXJpdHlfdmFsdWUgfiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJ2ZXlfdW5pdCp5ZWFybHlfc2Vhc19ieXBvaW50X2F2Zy5zY2FsZWRhY3Jvc3NhbGwgKyAjdGVtcCBhbmQgc3VydmV5IHVuaXQgKHBvc3NpYmxlIGludGVyYWN0aW9uKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cnZleV91bml0KnN1bW1lZF90b25uZXNfc2NhbGVkX2J5cmVnICsgI2Zpc2hpbmcgZWZmb3J0IGFuZCBzdXJ2ZXkgdW5pdCAocG9zc2libGUgaW50ZXJhY3Rpb24pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlYV9rbS5zY2FsZWRhY3Jvc3NhbGwgKyAjYXJlYQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGl0dWRlX2FubnVhbF9yYW5nZS5zY2FsZWRhY3Jvc3NhbGwgKyAjbGF0aXR1ZGUgcmFuZ2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRpdHVkZV9hbm51YWxfYXZnLnNjYWxlZGFjcm9zc2FsbCArICNsYXRpdHVkZSBhdmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aF9hbm51YWxfcmFuZ2Uuc2NhbGVkYWNyb3NzYWxsICsgI2RlcHRoIHJhbmdlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGhfYW5udWFsX2F2Zy5zY2FsZWRhY3Jvc3NhbGwgKyAjZGVwdGggYXZnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BwX2NvdW50X2FubnVhbC5zY2FsZWRhY3Jvc3NhbGwgKyAjc3BwICMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXVsX2lkX2NvdW50X2FubnVhbC5zY2FsZWRhY3Jvc3NhbGwgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXNvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGlzc2ltaWxhcml0eV9jb3ZhcmlhdGVzX2RyZWRnZS5kdCkKCiN3aXRoIHRlbXBvcmFsIGF1dG9jb3JyZWxhdGlvbgpnbG9iYWxfbW9kX3NlYXNfdGVtcF9nbHMgPC0gZ2xzKGFubnVhbF9kaXNzaW1pbGFyaXR5X3ZhbHVlIH4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VydmV5X3VuaXQqeWVhcmx5X3NlYXNfYnlwb2ludF9hdmcuc2NhbGVkYWNyb3NzYWxsICsgI3RlbXAgYW5kIHN1cnZleSB1bml0IChwb3NzaWJsZSBpbnRlcmFjdGlvbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJ2ZXlfdW5pdCpzdW1tZWRfdG9ubmVzX3NjYWxlZF9ieXJlZyArICNmaXNoaW5nIGVmZm9ydCBhbmQgc3VydmV5IHVuaXQgKHBvc3NpYmxlIGludGVyYWN0aW9uKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZWFfa20uc2NhbGVkYWNyb3NzYWxsICsgI2FyZWEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRpdHVkZV9hbm51YWxfcmFuZ2Uuc2NhbGVkYWNyb3NzYWxsICsgI2xhdGl0dWRlIHJhbmdlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0aXR1ZGVfYW5udWFsX2F2Zy5zY2FsZWRhY3Jvc3NhbGwgKyAjbGF0aXR1ZGUgYXZnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGhfYW5udWFsX3JhbmdlLnNjYWxlZGFjcm9zc2FsbCArICNkZXB0aCByYW5nZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoX2FubnVhbF9hdmcuc2NhbGVkYWNyb3NzYWxsICsgI2RlcHRoIGF2ZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcF9jb3VudF9hbm51YWwuc2NhbGVkYWNyb3NzYWxsICsgI3NwcCAjCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGF1bF9pZF9jb3VudF9hbm51YWwuc2NhbGVkYWNyb3NzYWxsICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWFzb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb24gPSBjb3JBUjEoZm9ybT1+eWVhciB8IHN1cnZleV91bml0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGlzc2ltaWxhcml0eV9jb3ZhcmlhdGVzX2RyZWRnZS5kdCkKCiNzdGFuZGFyZCBkZXZpYXRpb24KZ2xvYmFsX21vZF9TRF90ZW1wX2xtIDwtIGxtKGFubnVhbF9kaXNzaW1pbGFyaXR5X3ZhbHVlIH4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VydmV5X3VuaXQqeWVhcmx5X21lYW5fYnlwb2ludF9TRC5zY2FsZWRhY3Jvc3NhbGwgKyAjdGVtcCBhbmQgc3VydmV5IHVuaXQgKHBvc3NpYmxlIGludGVyYWN0aW9uKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cnZleV91bml0KnN1bW1lZF90b25uZXNfc2NhbGVkX2J5cmVnICsgI2Zpc2hpbmcgZWZmb3J0IGFuZCBzdXJ2ZXkgdW5pdCAocG9zc2libGUgaW50ZXJhY3Rpb24pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlYV9rbS5zY2FsZWRhY3Jvc3NhbGwgKyAjYXJlYQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGl0dWRlX2FubnVhbF9yYW5nZS5zY2FsZWRhY3Jvc3NhbGwgKyAjbGF0aXR1ZGUgcmFuZ2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRpdHVkZV9hbm51YWxfYXZnLnNjYWxlZGFjcm9zc2FsbCArICNsYXRpdHVkZSBhdmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aF9hbm51YWxfcmFuZ2Uuc2NhbGVkYWNyb3NzYWxsICsgI2RlcHRoIHJhbmdlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGhfYW5udWFsX2F2Zy5zY2FsZWRhY3Jvc3NhbGwgKyAjZGVwdGggYXZnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BwX2NvdW50X2FubnVhbC5zY2FsZWRhY3Jvc3NhbGwgKyAjc3BwICMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXVsX2lkX2NvdW50X2FubnVhbC5zY2FsZWRhY3Jvc3NhbGwgKwogICAgICAgICAgICAgICAgICAgICAgICAgICBzZWFzb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRpc3NpbWlsYXJpdHlfY292YXJpYXRlc19kcmVkZ2UuZHQpCgojd2l0aCB0ZW1wb3JhbCBhdXRvY29ycmVsYXRpb24KZ2xvYmFsX21vZF9TRF90ZW1wX2dscyA8LSBnbHMoYW5udWFsX2Rpc3NpbWlsYXJpdHlfdmFsdWUgfiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJ2ZXlfdW5pdCp5ZWFybHlfbWVhbl9ieXBvaW50X1NELnNjYWxlZGFjcm9zc2FsbCArICN0ZW1wIGFuZCBzdXJ2ZXkgdW5pdCAocG9zc2libGUgaW50ZXJhY3Rpb24pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VydmV5X3VuaXQqc3VtbWVkX3Rvbm5lc19zY2FsZWRfYnlyZWcgKyAjZmlzaGluZyBlZmZvcnQgYW5kIHN1cnZleSB1bml0IChwb3NzaWJsZSBpbnRlcmFjdGlvbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmVhX2ttLnNjYWxlZGFjcm9zc2FsbCArICNhcmVhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0aXR1ZGVfYW5udWFsX3JhbmdlLnNjYWxlZGFjcm9zc2FsbCArICNsYXRpdHVkZSByYW5nZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGl0dWRlX2FubnVhbF9hdmcuc2NhbGVkYWNyb3NzYWxsICsgI2xhdGl0dWRlIGF2ZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoX2FubnVhbF9yYW5nZS5zY2FsZWRhY3Jvc3NhbGwgKyAjZGVwdGggcmFuZ2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aF9hbm51YWxfYXZnLnNjYWxlZGFjcm9zc2FsbCArICNkZXB0aCBhdmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHBfY291bnRfYW5udWFsLnNjYWxlZGFjcm9zc2FsbCArICNzcHAgIwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhdWxfaWRfY291bnRfYW5udWFsLnNjYWxlZGFjcm9zc2FsbCArCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXNvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb24gPSBjb3JBUjEoZm9ybT1+eWVhciB8IHN1cnZleV91bml0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGlzc2ltaWxhcml0eV9jb3ZhcmlhdGVzX2RyZWRnZS5kdCkKCiNDb21wYXJlIEFJQ2NzClZpZXcoQUlDYyhnbG9iYWxfbW9kX21lYW5fdGVtcF9sbSwgZ2xvYmFsX21vZF9tYXhfdGVtcF9sbSwgZ2xvYmFsX21vZF9taW5fdGVtcF9sbSwgZ2xvYmFsX21vZF9zZWFzX3RlbXBfbG0sIGdsb2JhbF9tb2RfU0RfdGVtcF9sbSwKICAgICAgICAgIGdsb2JhbF9tb2RfbWVhbl90ZW1wX2dscywgZ2xvYmFsX21vZF9tYXhfdGVtcF9nbHMsIGdsb2JhbF9tb2RfbWluX3RlbXBfZ2xzLCBnbG9iYWxfbW9kX3NlYXNfdGVtcF9nbHMsIGdsb2JhbF9tb2RfU0RfdGVtcF9nbHMpKQoKI2J1aWxkIGRhdGEgdGFibGUgdG8gcmVwb3J0IEFJQ2MKZ2xvYmFsX21vZF90ZW1wX3RhYmxlIDwtIGRhdGEudGFibGUoCiAgYFRlbXBvcmFsIGF1dG9jb3JyZWxhdGlvbmAgPSBjKAogICAgYyhyZXAoRiw1KSxyZXAoVCw1KSkKICApLAogIGBUZW1wZXJhdHVyZSB2YXJpYWJsZWAgPSByZXAoYyggICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAiQXZlcmFnZSBtZWFuIFNCVCIsCiAgICAgICAgICAgICAgIkF2ZXJhZ2UgbWF4aW11bSBTQlQiLCAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICJBdmVyYWdlIG1pbmltdW0gU0JUIiwgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAiQXZlcmFnZSBTQlQgc2Vhc29uYWxpdHkiLCAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgIlNCVCBTRCIpLDIpLAogIGRlbHRhQUlDYyA9IHNpZ25pZihtaW4oQUlDYyhnbG9iYWxfbW9kX21lYW5fdGVtcF9sbSwgZ2xvYmFsX21vZF9tYXhfdGVtcF9sbSwgZ2xvYmFsX21vZF9taW5fdGVtcF9sbSwgZ2xvYmFsX21vZF9zZWFzX3RlbXBfbG0sIGdsb2JhbF9tb2RfU0RfdGVtcF9sbSwKICAgICAgICAgIGdsb2JhbF9tb2RfbWVhbl90ZW1wX2dscywgZ2xvYmFsX21vZF9tYXhfdGVtcF9nbHMsIGdsb2JhbF9tb2RfbWluX3RlbXBfZ2xzLCBnbG9iYWxfbW9kX3NlYXNfdGVtcF9nbHMsIGdsb2JhbF9tb2RfU0RfdGVtcF9nbHMpWywyXSktQUlDYyhnbG9iYWxfbW9kX21lYW5fdGVtcF9sbSwgZ2xvYmFsX21vZF9tYXhfdGVtcF9sbSwgZ2xvYmFsX21vZF9taW5fdGVtcF9sbSwgZ2xvYmFsX21vZF9zZWFzX3RlbXBfbG0sIGdsb2JhbF9tb2RfU0RfdGVtcF9sbSwKICAgICAgICAgIGdsb2JhbF9tb2RfbWVhbl90ZW1wX2dscywgZ2xvYmFsX21vZF9tYXhfdGVtcF9nbHMsIGdsb2JhbF9tb2RfbWluX3RlbXBfZ2xzLCBnbG9iYWxfbW9kX3NlYXNfdGVtcF9nbHMsIGdsb2JhbF9tb2RfU0RfdGVtcF9nbHMpWywyXSwyKSkKCiNvcmRlciBieSBhaWNjCnNldG9yZGVyKGdsb2JhbF9tb2RfdGVtcF90YWJsZSxjb2xzID0gLSJkZWx0YUFJQ2MiKQoKZ2xvYmFsX21vZF90ZW1wX3RhYmxlWyxSYW5rIDo9IHNlcSgxLDEwLGJ5ID0gMSldCgpnbG9iYWxfbW9kX3NidF90YWJsZSA8LSBnbG9iYWxfbW9kX3RlbXBfdGFibGVbLC4oUmFuayxgVGVtcG9yYWwgYXV0b2NvcnJlbGF0aW9uYCxgVGVtcGVyYXR1cmUgdmFyaWFibGVgLCBkZWx0YUFJQ2MpXQoKZndyaXRlKGdsb2JhbF9tb2Rfc2J0X3RhYmxlLCBoZXJlOjpoZXJlKCJvdXRwdXQiLCJnbG9iYWxfbW9kX3NidF90YWJsZS5jc3YiKSkKCmBgYAoKIyMjI0Jlc3QgcGVyZm9ybWluZyBnbG9iYWwgbW9kZWwgaW5jbHVkZXMgbWluaW11bSB0ZW1wZXJhdHVyZSAoY2VudGVyZWQgYW5kIHNjYWxlZCkgKFN0aWxsIHRoZSBjYXNlIGFzIG9mIEp1bHkgMTcsIDIwMjQpCgpOb3csIGxvb2sgYXQgZGlmZmVyZW50IGNvbWJpbmF0aW9ucyBvZiBhbGwgcHJlZGljdG9ycyAobWluIHRlbXApIHVzaW5nIGRyZWRnZQoKR2xvYmFsIG1vZGVsOiBnbG9iYWxfbW9kX21pbl90ZW1wCgpgYGB7cn0Kb3B0aW9ucyhuYS5hY3Rpb24gPSAibmEuZmFpbCIpICMgIHByZXZlbnQgZml0dGluZyBzdWItbW9kZWxzIHRvIGRpZmZlcmVudCBkYXRhc2V0cwpkZCA8LSBkcmVkZ2UoZ2xvYmFsX21vZF9taW5fdGVtcF9sbSkKZGQuZHQgPC0gZGF0YS50YWJsZShkZCkKVmlldyhkZCkKCiNvbmx5IG1vZGVscyBsZXNzIHRoYW4gMiBkZWx0YSBBSUNjICgyIG1vZGVscykKZGQuZHQuMiA8LSBkZC5kdFtkZWx0YSA8PSAyLF0KCmNvbG5hbWVzKGRkLmR0LjIpCgojaW4gdGhpcyBzdGVwLCB3ZSBkZWxldGUgY29lZmZpY2llbnQgdmFsdWVzIGJlY2F1c2Ugd2Ugd2lsbCBwdWxsIHRoZW0gYmFjayBpbiBsYXRlciB3aGVuIHdlIGNhbGN1bGF0ZSBib3RoIFNFIGFuZCBjb2VmZmljaWVudHMgKG90aGVyIHRoYW4gaW50ZXJhY3Rpb24sIHdoaWNoIHdlIGtlZXAgaGVyZSkKZGQuZHQuMi5mb3JtYXR0ZWQgPC0gZGQuZHQuMlssUmFuayA6PSBhcy5udW1lcmljKHJvd25hbWVzKGRkLmR0LjIpKV1bLC4oUmFuaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgc3VtbWVkX3Rvbm5lc19zY2FsZWRfYnlyZWc6c3VydmV5X3VuaXRgLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBzdXJ2ZXlfdW5pdDp5ZWFybHlfbWluX2J5cG9pbnRfYXZnLnNjYWxlZGFjcm9zc2FsbGAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0LCBzdXJ2ZXlfdW5pdCwgc2Vhc29uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKV0KCiNhZGQgci1zcXVhcmVkIHZhbHVlcwojIEl0ZXJhdGUgdGhyb3VnaCB0aGUgYmVzdCBtb2RlbHMgYW5kIGV4dHJhY3QgUi1zcXVhcmVkIHZhbHVlcwpyX3NxdWFyZWRfdmFsdWVzIDwtbGlzdCgpCmZvciAoaSBpbiAxOm5yb3coZGQuZHQuMi5mb3JtYXR0ZWQpKSB7CiAgc3VtbWFyeV9kYXRhIDwtIHN1bW1hcnkoZ2V0Lm1vZGVscyhkZCwgc3Vic2V0ID0gaSlbWzFdXSkKICByX3NxdWFyZWQgPC0gc2lnbmlmKHN1bW1hcnlfZGF0YSRyLnNxdWFyZWQsMikKICByX3NxdWFyZWRfdmFsdWVzIDwtIHVubGlzdChjKHJfc3F1YXJlZF92YWx1ZXMscl9zcXVhcmVkKSkKfQoKZGQuZHQuMi5mb3JtYXR0ZWRbLCJSIHNxdWFyZWQiIDo9IHJfc3F1YXJlZF92YWx1ZXNdCgojZW1wdHkgZGF0YSB0YWJsZQoKbW9kZWxfY29lZl9zZV9maWxsIDwtIGRhdGEudGFibGUoUmFuayA9IGFzLm51bWVyaWMoKSwgY29lZl9uYW1lID0gYXMuY2hhcmFjdGVyKCksY29lZiA9IGFzLm51bWVyaWMoKSwgc2UgPSBhcy5udW1lcmljKCkpCgpmb3IgKGkgaW4gMTpucm93KGRkLmR0LjIuZm9ybWF0dGVkKSl7CiAgbW9kZWxfY29lZl9zZV9zaW5nbGUgPC0gZGF0YS50YWJsZSh1bmxpc3QoY29lZlRhYmxlKGRkLGZ1bGwgPSBUKVtbaV1dKSkKICBtb2RlbF9jb2VmX3NlX3NpbmdsZVssY29lZl9uYW1lcyA6PSByb3duYW1lcyh1bmxpc3QoY29lZlRhYmxlKGRkLGZ1bGwgPSBUKVtbaV1dKSldCiAgbW9kZWxfY29lZl9zZV9zaW5nbGVbLFJhbmsgOj0gaV0KICAKICBjb2xuYW1lcyhtb2RlbF9jb2VmX3NlX3NpbmdsZSkgPC0gYygiY29lZiIsInNlIiwiZGYiLCJjb2VmX25hbWUiLCJSYW5rIikKICAKICAjcmVkdWNlIHRvIGNvbHVtbnMgd2UgbmVlZAogIG1vZGVsX2NvZWZfc2Vfc2luZ2xlIDwtIG1vZGVsX2NvZWZfc2Vfc2luZ2xlWywuKFJhbmssIGNvZWZfbmFtZSwgY29lZiwgc2UpXQogIAogIG1vZGVsX2NvZWZfc2VfZmlsbCA8LSByYmluZChtb2RlbF9jb2VmX3NlX2ZpbGwsbW9kZWxfY29lZl9zZV9zaW5nbGUpCn0KCiNmb3JtYXQgdG8gbWVyZ2Ugd2l0aCBtb2RlbCByYW5raW5ncyBhbmQgYXZlcmFnZWQgbW9kZWwKbW9kZWxfY29lZl9zZV9maWxsWyxjb2VmX3NlIDo9IHBhc3RlMChyb3VuZChjb2VmLDMpLCIgwrEgIixyb3VuZChzZSwzKSldCgojZGVsZXRlIGV4dHJhIGNvbHVtbnMKbW9kZWxfY29lZl9zZV9maWxsIDwtIG1vZGVsX2NvZWZfc2VfZmlsbFssLihSYW5rLGNvZWZfbmFtZSxjb2VmX3NlKV0KCiNsb25nIHRvIHdpZGUKbW9kZWxfY29lZl9zZV9maWxsLncgPC0gZGNhc3QobW9kZWxfY29lZl9zZV9maWxsLCBmb3JtdWxhID0gUmFuayB+IGNvZWZfbmFtZSwgdmFsdWUudmFyID0gYygiY29lZl9zZSIpKQoKI21lcmdlIG1vZGVsX2NvZWZfc2VfZmlsbCB3aXRoIGRkLmR0LjIuZm9ybWF0dGVkCm1vZGVsX2NvZWZfc2VfQUlDIDwtIGRkLmR0LjIuZm9ybWF0dGVkW21vZGVsX2NvZWZfc2VfZmlsbC53LCBvbiA9ICJSYW5rIl0KCiNtb2RlbCBhdmVyYWdlIGFsbCBtb2RlbHMgd2l0aCBkZWx0YSA8IDQgKDggbW9kZWxzKQptb2RlbF9hdmdfZGVsdGE0IDwtbW9kZWwuYXZnKGRkLCBzdWJzZXQgPSBkZWx0YSA8IDQsIGZpdCA9IFQpICNOQjogVGhlIOKAmHN1YnNldOKAmSAob3Ig4oCYY29uZGl0aW9uYWzigJkpIGF2ZXJhZ2Ugb25seSAgIGF2ZXJhZ2VzIG92ZXIgdGhlIG1vZGVscyB3aGVyZSB0aGUgcGFyYW1ldGVyIGFwcGVhcnMuIEFuIGFsdGVybmF0aXZlLCB0aGUg4oCYZnVsbOKAmSBhdmVyYWdlIGFzc3VtZXMgdGhhdCBhIHZhcmlhYmxlIGlzIGluY2x1ZGVkIGluIGV2ZXJ5IG1vZGVsLCBidXQgaW4gc29tZSBtb2RlbHMgdGhlIGNvcnJlc3BvbmRpbmcgY29lZmZpY2llbnQgKGFuZCBpdHMgcmVzcGVjdGl2ZSB2YXJpYW5jZSkgaXMgc2V0IHRvIHplcm8uIFVubGlrZSB0aGUg4oCYc3Vic2V0IGF2ZXJhZ2XigJksIGl0IGRvZXMgbm90IGhhdmUgYSB0ZW5kZW5jeSBvZiBiaWFzaW5nIHRoZSB2YWx1ZSBhd2F5IGZyb20gemVyby4gVGhlIOKAmGZ1bGzigJkgYXZlcmFnZSBpcyBhIHR5cGUgb2Ygc2hyaW5rYWdlIGVzdGltYXRvciwgYW5kIGZvciB2YXJpYWJsZXMgd2l0aCBhIHdlYWsgcmVsYXRpb25zaGlwIHRvIHRoZSByZXNwb25zZSBpdCBpcyBzbWFsbGVyIHRoYW4g4oCYc3Vic2V04oCZIGVzdGltYXRvcnMuLCBmaXQgPSBUIGZpdHMgdGhlIGNvbXBvbmVudCBtb2RlbHMgYWdhaW4KCm1vZGVsX2F2Z192YWx1ZXMgPC0gYXMuZGF0YS50YWJsZShjb2VmVGFibGUobW9kZWxfYXZnX2RlbHRhNCxmaWxsID0gVCkpICMgd2l0aCBTRQpjb2VmX25hbWVzIDwtIG5hbWVzKGNvZWYobW9kZWwuYXZnKGRkLCBzdWJzZXQgPSBkZWx0YSA8IDQpKSkKbW9kZWxfYXZnX3ZhbHVlc1ssY29lZl9uYW1lOj1jb2VmX25hbWVzXVssY29lZjo9RXN0aW1hdGVdWyxFc3RpbWF0ZTo9TlVMTF1bLGRmOj1OVUxMXVssc2U6PSBgU3RkLiBFcnJvcmBdWyxgU3RkLiBFcnJvcmAgOj0gTlVMTF0KCiNuZXcgY29sdW1uIHdpdGggY29lZiBhbmQgU0UKbW9kZWxfYXZnX3ZhbHVlc1ssY29lZl9zZSA6PSBwYXN0ZTAocm91bmQoY29lZiwzKSwiIMKxICIscm91bmQoc2UsMykpXQoKI2xvbmcgdG8gd2lkZSBmb3IgbW9kZWwgYXZnCm1vZGVsX2F2Zy53aWRlIDwtIGRjYXN0KG1vZGVsX2F2Z192YWx1ZXMsIGZvcm11bGEgPSAuIH4gY29lZl9uYW1lLCB2YWx1ZS52YXIgPSBjKCJjb2VmX3NlIikpCgojYWRkIHJhbmsgb2YgIm1vZGVsIGF2ZyIgdG8gdGFibGUKbW9kZWxfYXZnLndpZGVbLFJhbmsgOj0gIk1vZGVsIGF2ZyJdCgpiZXN0X21vZGVsX3NidF9qYWNjYXJkX3RhYmxlX2Zvcm1hdHRlZCA8LSByYmluZChtb2RlbF9jb2VmX3NlX0FJQywgbW9kZWxfYXZnLndpZGUsIGZpbGwgPSBUKQoKI2dldCByaWQgb2YgaW50ZXJhY3Rpb24gY29lZmZpY2llbnRzCmJlc3RfbW9kZWxfc2J0X2phY2NhcmRfdGFibGVfZm9ybWF0dGVkLnIgPC0gYmVzdF9tb2RlbF9zYnRfamFjY2FyZF90YWJsZV9mb3JtYXR0ZWRbLC4oUmFuayxgKEludGVyY2VwdClgLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZWFfa20uc2NhbGVkYWNyb3NzYWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoX2FubnVhbF9hdmcuc2NhbGVkYWNyb3NzYWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoX2FubnVhbF9yYW5nZS5zY2FsZWRhY3Jvc3NhbGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGF1bF9pZF9jb3VudF9hbm51YWwuc2NhbGVkYWNyb3NzYWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGl0dWRlX2FubnVhbF9hdmcuc2NhbGVkYWNyb3NzYWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGl0dWRlX2FubnVhbF9yYW5nZS5zY2FsZWRhY3Jvc3NhbGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BwX2NvdW50X2FubnVhbC5zY2FsZWRhY3Jvc3NhbGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtbWVkX3Rvbm5lc19zY2FsZWRfYnlyZWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vhc29uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cnZleV91bml0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllYXJseV9taW5fYnlwb2ludF9hdmcuc2NhbGVkYWNyb3NzYWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBzdW1tZWRfdG9ubmVzX3NjYWxlZF9ieXJlZzpzdXJ2ZXlfdW5pdGAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYHN1cnZleV91bml0OnllYXJseV9taW5fYnlwb2ludF9hdmcuc2NhbGVkYWNyb3NzYWxsYCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgUiBzcXVhcmVkYCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXQoKI3JvdW5kIHRvIDIgc2lnbmlmaWNhbnQgZmlndXJlcwoKI25hbWVzIG9mIG51bWVyaWMgY29sdW1ucwpudW1lcmljX2NvbHMgPC0gbmFtZXMoYmVzdF9tb2RlbF9zYnRfamFjY2FyZF90YWJsZV9mb3JtYXR0ZWQucilbc2FwcGx5KGJlc3RfbW9kZWxfc2J0X2phY2NhcmRfdGFibGVfZm9ybWF0dGVkLnIsIGlzLm51bWVyaWMpXQoKIyBBcHBseSBzaWduaWYoKSBvbmx5IHRvIG51bWVyaWMgY29sdW1ucwpiZXN0X21vZGVsX3NidF9qYWNjYXJkX3RhYmxlX2Zvcm1hdHRlZC5yWywgKG51bWVyaWNfY29scykgOj0gbGFwcGx5KC5TRCwgZnVuY3Rpb24oeCkgaWYgKGlzLm51bWVyaWMoeCkpIHNpZ25pZih4LCBkaWdpdHMgPSAyKSBlbHNlIHgpLCAuU0Rjb2xzID0gbnVtZXJpY19jb2xzXQoKI2NoYW5nZSBjb2x1bW4gbmFtZXMsIGluIGNhcHRpb24gbm90ZSB0aGF0IGFsbCB2YXJpYWJsZXMgYXJlIGNlbnRlcmVkIGFuZCBzY2FsZWQKY29sbmFtZXMoYmVzdF9tb2RlbF9zYnRfamFjY2FyZF90YWJsZV9mb3JtYXR0ZWQucikgPC0gYygKIlJhbmsiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIkludGVyY2VwdCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAoiQXJlYSIsICAgICAgICNzY2FsZWQgYWNyb3NzIGFsbCAgICAgICAgICAgICAgICAgICAgCiJBdmVyYWdlIGRlcHRoIiwgICAgICAgICAgICAgICAgICAKIkRlcHRoIHJhbmdlIiwgICAgICAgICAgICAgICAgCiJOdW1iZXIgb2YgdG93cyIsICAgICAKIkF2ZXJhZ2UgbGF0aXR1ZGUiLCAgICAgICAgICAgICAgIAoiTGF0aXR1ZGUgcmFuZ2UiLCAgICAgICAgICAgICAKIlNwZWNpZXMgY291bnQiLCAgICAgICAgICAgICAgICAgIAoiUmVsYXRpdmUgY2F0Y2giLCAjc2NhbGVkIHdpdGhpbiByZWdpb24gICAgCiJTZWFzb24iLAoiU3VydmV5IiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIkF2ZXJhZ2UgbWluaW11bSB0ZW1wZXJhdHVyZSIsICAgICAgICAgICAgCiJTdXJ2ZXkgKiByZWxhdGl2ZSBjYXRjaCIsICAgICAgICAgICAgCiJTdXJ2ZXkgKiBhdmcgbWluIHRlbXBlcmF0dXJlIiwKIlIgc3F1YXJlZCIsCnBhc3RlMCgiXHUwMzk0IiwiIEFJQ2MiKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKcGFzdGUwKCJcdTAzQzkiKSkKCgoKI3NhdmUgYXMgY3N2Cgpmd3JpdGUoYmVzdF9tb2RlbF9zYnRfamFjY2FyZF90YWJsZV9mb3JtYXR0ZWQucixoZXJlOjpoZXJlKCJvdXRwdXQiLCJiZXN0X21vZGVsX3NidF9qYWNjYXJkX3RhYmxlX2Zvcm1hdHRlZC5jc3YiKSkKYGBgCgojIyNQcmVkaWN0IGRpc3NpbWlsYXJpdHkgYWNyb3NzIHllYXJzIHVzaW5nIGF2ZXJhZ2VkIG1vZGVsIChtb2RlbF9hdmdfZGVsdGE0KQpgYGB7cn0KZGlzc2ltaWxhcml0eV9jb3ZhcmlhdGVzX2RyZWRnZS5kdF9wcmVkaWN0aW9ucyA8LSBjb3B5KGRpc3NpbWlsYXJpdHlfY292YXJpYXRlc19kcmVkZ2UuZHQpCgogICNhbGxvd2luZyB0ZW1wIGFuZCBmaXNoaW5nIHRvIHZhcnkgKGFrYSBubyBjaGFuZ2VzKQogIGRpc3NpbWlsYXJpdHlfY292YXJpYXRlc19kcmVkZ2UuZHRfcHJlZGljdGlvbnNbLHByZWRfZGlzc2ltIDo9IHByZWRpY3QobW9kZWxfYXZnX2RlbHRhNCwgc2UuZml0ID0gVCwgZnVsbCA9IEYpW1sxXV1dWyxwcmVkX3NlIDo9IHByZWRpY3QobW9kZWxfYXZnX2RlbHRhNCwgc2UuZml0ID0gVCwgZnVsbCA9IEYpW1syXV1dICNmdWxsIGFsbG93cyB1cyB0byBzd2l0Y2ggYmFjayB0byBtaXhlZCBlZmZlY3QgbW9kZWxzCgogICNXaGF0J3MgdGhlIFJeMiB2YWx1ZT8KICByLnNxdWFyZWRHTE1NKGxtKGRhdGEgPSBkaXNzaW1pbGFyaXR5X2NvdmFyaWF0ZXNfZHJlZGdlLmR0X3ByZWRpY3Rpb25zLCBhbm51YWxfZGlzc2ltaWxhcml0eV92YWx1ZSB+IHByZWRfZGlzc2ltKSkKICAjUjIgPSAwLjk1MDc2NTkKICAKICAjY29uc3RhbnQgdGVtcCBpbiByZWdpb25zIChha2EgdGFrZSBtZWFuIG9mIHRlbXBlcmF0dXJlIHZhbHVlcyB3aXRoaW4gc3VydmV5IHVuaXRzIHNvIHRoZXkgYXJlIHRoZSBzYW1lIHZhbHVlIHdpdGhpbiBlYWNoIHllYXIgZm9yIGEgc3VydmV5KQogIGRpc3NpbWlsYXJpdHlfY292YXJpYXRlc19kcmVkZ2UuZHRfcHJlZGljdGlvbnNfY29uc2lzdGVudHRlbXBpbnJlZyA8LSBjb3B5KGRpc3NpbWlsYXJpdHlfY292YXJpYXRlc19kcmVkZ2UuZHQpCiAgZGlzc2ltaWxhcml0eV9jb3ZhcmlhdGVzX2RyZWRnZS5kdF9wcmVkaWN0aW9uc19jb25zaXN0ZW50dGVtcGlucmVnWyx5ZWFybHlfbWluX2J5cG9pbnRfYXZnLnNjYWxlZGFjcm9zc2FsbDo9bWVhbih5ZWFybHlfbWluX2J5cG9pbnRfYXZnLnNjYWxlZGFjcm9zc2FsbCksLihzdXJ2ZXlfdW5pdCldCiAgZGlzc2ltaWxhcml0eV9jb3ZhcmlhdGVzX2RyZWRnZS5kdF9wcmVkaWN0aW9uc19jb25zaXN0ZW50dGVtcGlucmVnWyxwcmVkX2Rpc3NpbSA6PSBwcmVkaWN0KG1vZGVsX2F2Z19kZWx0YTQsIHNlLmZpdCA9IFQsIGZ1bGwgPSBGLCBuZXdkYXRhID0gZGlzc2ltaWxhcml0eV9jb3ZhcmlhdGVzX2RyZWRnZS5kdF9wcmVkaWN0aW9uc19jb25zaXN0ZW50dGVtcGlucmVnKVtbMV1dXVsscHJlZF9zZSA6PSBwcmVkaWN0KG1vZGVsX2F2Z19kZWx0YTQsIHNlLmZpdCA9IFQsIGZ1bGwgPSBGKVtbMl1dXQogIAogICAgI1doYXQncyB0aGUgUl4yIHZhbHVlPwogIHIuc3F1YXJlZEdMTU0obG0oZGF0YSA9IGRpc3NpbWlsYXJpdHlfY292YXJpYXRlc19kcmVkZ2UuZHRfcHJlZGljdGlvbnNfY29uc2lzdGVudHRlbXBpbnJlZywgYW5udWFsX2Rpc3NpbWlsYXJpdHlfdmFsdWUgfiBwcmVkX2Rpc3NpbSkpCiAgI1IyID0gMC45NCAob25seSBmaXNoaW5nISEpCgogICNjb25zdGFudCBmaXNoaW5nIGluIHJlZ2lvbnMgKGFrYSB0YWtlIG1lYW4gb2YgZmlzaGluZyB2YWx1ZXMgd2l0aGluIHN1cnZleSB1bml0cyBzbyB0aGV5IGFyZSB0aGUgc2FtZSB2YWx1ZSB3aXRoaW4gZWFjaCB5ZWFyIGZvciBhIHN1cnZleSkKICBkaXNzaW1pbGFyaXR5X2NvdmFyaWF0ZXNfZHJlZGdlLmR0X3ByZWRpY3Rpb25zX2NvbnNpc3RlbnRmaXNoaW5naW5yZWcgPC0gY29weShkaXNzaW1pbGFyaXR5X2NvdmFyaWF0ZXNfZHJlZGdlLmR0KQogIGRpc3NpbWlsYXJpdHlfY292YXJpYXRlc19kcmVkZ2UuZHRfcHJlZGljdGlvbnNfY29uc2lzdGVudGZpc2hpbmdpbnJlZ1ssc3VtbWVkX3Rvbm5lc19zY2FsZWRfYnlyZWc6PW1lYW4oc3VtbWVkX3Rvbm5lc19zY2FsZWRfYnlyZWcpLC4oc3VydmV5X3VuaXQpXQogIAogICAgZGlzc2ltaWxhcml0eV9jb3ZhcmlhdGVzX2RyZWRnZS5kdF9wcmVkaWN0aW9uc19jb25zaXN0ZW50ZmlzaGluZ2lucmVnWyxwcmVkX2Rpc3NpbSA6PSBwcmVkaWN0KG1vZGVsX2F2Z19kZWx0YTQsIHNlLmZpdCA9IFQsIGZ1bGwgPSBGLCBuZXdkYXRhID0gZGlzc2ltaWxhcml0eV9jb3ZhcmlhdGVzX2RyZWRnZS5kdF9wcmVkaWN0aW9uc19jb25zaXN0ZW50ZmlzaGluZ2lucmVnKVtbMV1dXVsscHJlZF9zZSA6PSBwcmVkaWN0KG1vZGVsX2F2Z19kZWx0YTQsIHNlLmZpdCA9IFQsIGZ1bGwgPSBGKVtbMl1dXQogIAogICAgI1doYXQncyB0aGUgUl4yIHZhbHVlPwogIHIuc3F1YXJlZEdMTU0obG0oZGF0YSA9IGRpc3NpbWlsYXJpdHlfY292YXJpYXRlc19kcmVkZ2UuZHRfcHJlZGljdGlvbnNfY29uc2lzdGVudGZpc2hpbmdpbnJlZywgYW5udWFsX2Rpc3NpbWlsYXJpdHlfdmFsdWUgfiBwcmVkX2Rpc3NpbSkpCiAgI1IyID0gMC45NCAob25seSB0ZW1wZXJhdHVyZSEhKQoKI2FuZCB0aGVuIHdpdGggY29uc2lzdGVudCB0ZW1wIGFuZCBmaXNoaW5nIGluIHJlZ2lvbnMgKGFrYSB0YWtlIG1lYW4gb2YgYm90aCBtaW4gdGVtcCBhbmQgZmlzaGluZykKZGlzc2ltaWxhcml0eV9jb3ZhcmlhdGVzX2RyZWRnZS5kdF9wcmVkaWN0aW9uc19jb25zaXN0ZW50dGVtcGZpc2hpbmdpbnJlZyA8LSBjb3B5KGRpc3NpbWlsYXJpdHlfY292YXJpYXRlc19kcmVkZ2UuZHQpCmRpc3NpbWlsYXJpdHlfY292YXJpYXRlc19kcmVkZ2UuZHRfcHJlZGljdGlvbnNfY29uc2lzdGVudHRlbXBmaXNoaW5naW5yZWdbLHN1bW1lZF90b25uZXNfc2NhbGVkX2J5cmVnOj1tZWFuKHN1bW1lZF90b25uZXNfc2NhbGVkX2J5cmVnKSwuKHN1cnZleV91bml0KV1bLHllYXJseV9taW5fYnlwb2ludF9hdmcuc2NhbGVkYWNyb3NzYWxsOj1tZWFuKHllYXJseV9taW5fYnlwb2ludF9hdmcuc2NhbGVkYWNyb3NzYWxsKSwuKHN1cnZleV91bml0KV0KCiAgICBkaXNzaW1pbGFyaXR5X2NvdmFyaWF0ZXNfZHJlZGdlLmR0X3ByZWRpY3Rpb25zX2NvbnNpc3RlbnR0ZW1wZmlzaGluZ2lucmVnWyxwcmVkX2Rpc3NpbSA6PSBwcmVkaWN0KG1vZGVsX2F2Z19kZWx0YTQsIHNlLmZpdCA9IFQsIGZ1bGwgPSBGLCBuZXdkYXRhID0gZGlzc2ltaWxhcml0eV9jb3ZhcmlhdGVzX2RyZWRnZS5kdF9wcmVkaWN0aW9uc19jb25zaXN0ZW50dGVtcGZpc2hpbmdpbnJlZylbWzFdXV1bLHByZWRfc2UgOj0gcHJlZGljdChtb2RlbF9hdmdfZGVsdGE0LCBzZS5maXQgPSBULCBmdWxsID0gRilbWzJdXV0KICAKICAgICNXaGF0J3MgdGhlIFJeMiB2YWx1ZT8KICByLnNxdWFyZWRHTE1NKGxtKGRhdGEgPSBkaXNzaW1pbGFyaXR5X2NvdmFyaWF0ZXNfZHJlZGdlLmR0X3ByZWRpY3Rpb25zX2NvbnNpc3RlbnR0ZW1wZmlzaGluZ2lucmVnLCBhbm51YWxfZGlzc2ltaWxhcml0eV92YWx1ZSB+IHByZWRfZGlzc2ltKSkKICAjUjIgPSAwLjkzIChvbmx5IG90aGVyIHZhcmlhYmxlcyEhISBub3QgdGVtcCBvciBmaXNoaW5nKQoKCiNhbGxvd2luZyB0ZW1wIGFuZCBmaXNoaW5nIHRvIHZhcnkgd2l0aGluIHJlZ3MgKG5vcm1hbCkKICAgIGRpc3NpbWlsYXJpdHlfY292YXJpYXRlc19kcmVkZ2UuZHRfcHJlZGljdGlvbnNbLHByZWRfZGlzc2ltIDo9IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRpY3QobW9kZWxfYXZnX2RlbHRhNCwgc2UuZml0ID0gVCwgZnVsbCA9IEYsIG5ld2RhdGEgPSAgIGRpc3NpbWlsYXJpdHlfY292YXJpYXRlc19kcmVkZ2UuZHRfcHJlZGljdGlvbnMpW1sxXV1dWyxwcmVkX3NlIDo9IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGljdChtb2RlbF9hdmdfZGVsdGE0LCBzZS5maXQgPSBULCBmdWxsID0gRiwgbmV3ZGF0YSA9ICAgZGlzc2ltaWxhcml0eV9jb3ZhcmlhdGVzX2RyZWRnZS5kdF9wcmVkaWN0aW9ucylbWzJdXV0KICAKI2FsbG93aW5nIG9ubHkgZmlzaGluZyB0byB2YXJ5IHdpdGhpbiByZWdpb25zICh3aXRoIG1lYW4gdGVtcCkKICAKICAgZGlzc2ltaWxhcml0eV9jb3ZhcmlhdGVzX2RyZWRnZS5kdF9wcmVkaWN0aW9uc19jb25zaXN0ZW50dGVtcGlucmVnWyxwcmVkX2Rpc3NpbSA6PSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGljdChtb2RlbF9hdmdfZGVsdGE0LCBzZS5maXQgPSBULCBmdWxsID0gRiwgbmV3ZGF0YSA9IGRpc3NpbWlsYXJpdHlfY292YXJpYXRlc19kcmVkZ2UuZHRfcHJlZGljdGlvbnNfY29uc2lzdGVudHRlbXBpbnJlZylbWzFdXV1bLHByZWRfc2UgOj0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkaWN0KG1vZGVsX2F2Z19kZWx0YTQsIHNlLmZpdCA9IFQsIGZ1bGwgPSBGLCBuZXdkYXRhID0gZGlzc2ltaWxhcml0eV9jb3ZhcmlhdGVzX2RyZWRnZS5kdF9wcmVkaWN0aW9uc19jb25zaXN0ZW50dGVtcGlucmVnKVtbMl1dXQoKCgojRk9SIENPTE9SIFRPIE1BVENICiNzb3J0IGNvbG9yIGxpbmsgYnkgc3VydmV5IG5hbWUgc2Vhc29uCiNhbHBoYWJldGljYWwgb3JkZXIKY29sb3JfbGlua19hbHBoYSA8LSBzZXRvcmRlcihjb2xvcl9saW5rLCBzdXJ2ZXlfdW5pdCkKCiNleGNsdWRlIHN1cnZleXMgd2UgZG9uJ3QgaW5jbHVkZQpjb2xvcl9saW5rX2FscGhhIDwtIGNvbG9yX2xpbmtfYWxwaGFbc3VydmV5X3VuaXQgJWluJSB1bmlxdWUoZGlzc2ltaWxhcml0eV9jb3ZhcmlhdGVzX2RyZWRnZS5kdF9wcmVkaWN0aW9ucyRzdXJ2ZXlfdW5pdCksXQoKY29sb3JfYWxwaGFfb3JkZXIgPC0gY29sb3JfbGlua19hbHBoYVssaGV4XQpsYWJlbF9hbHBoYV9vcmRlciA8LSBjb2xvcl9saW5rX2FscGhhWyxTdXJ2ZXlfTmFtZV9TZWFzb25dCiAgCgojbWFpbnRhaW4gdGVtcCBhbmQgZmlzaGluZwojcGxvdApwcmVkaWN0ZWRfdmFsdWVzX3RlbXBfZmlzaGluZyA8LSBnZ3Bsb3QoZGlzc2ltaWxhcml0eV9jb3ZhcmlhdGVzX2RyZWRnZS5kdF9wcmVkaWN0aW9ucykgKwogIGdlb21fcG9pbnQoYWVzKHggPSB5ZWFyLCB5ID0gYW5udWFsX2Rpc3NpbWlsYXJpdHlfdmFsdWUsIGNvbG9yID0gc3VydmV5X3VuaXQpKSArCiAgZ2VvbV9saW5lKGFlcyh4ID0geWVhciwgeSA9IHByZWRfZGlzc2ltLCBjb2xvciA9IHN1cnZleV91bml0KSkgKwogIGdlb21fcmliYm9uKGFlcyh4ID0geWVhciwgeW1pbiA9IHByZWRfZGlzc2ltLXByZWRfc2UsIHltYXggPSBwcmVkX2Rpc3NpbStwcmVkX3NlLCBmaWxsID0gc3VydmV5X3VuaXQpLCBhbHBoYSA9IDAuMykgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjb2xvcl9hbHBoYV9vcmRlciwgbGFiZWxzID0gbGFiZWxfYWxwaGFfb3JkZXIsIG5hbWUgPSAiU3VydmV5IikgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGNvbG9yX2FscGhhX29yZGVyLCBsYWJlbHMgPSBsYWJlbF9hbHBoYV9vcmRlciwgbmFtZSA9ICJTdXJ2ZXkiKSArCiAgbGFicyh4ID0gIlllYXIiLHkgPSAiQXZlcmFnZSBhbm51YWwgdG90YWxcbkJyYXkgQ3VydGlzIGRpc3NpbWlsYXJpdHkiKSArCiAgeWxpbSgwLDEuNSkgKwogIHRoZW1lX2NsYXNzaWMoKSArCiAgZ2d0aXRsZSgiQXZlcmFnZSBtb2RlbCBwcmVkaWN0aW9ucyIpCgojYXZlcmFnZSB0ZW1wIGFuZCBmaXNoaW5nIGZvciBlYWNoIHJlZ2lvbgpwcmVkaWN0ZWRfdmFsdWVzX3RlbXBfZmlzaGluZ19tZWFudGVtcGZpc2hpbmdpbnN1cnZleSA8LSBnZ3Bsb3QoZGlzc2ltaWxhcml0eV9jb3ZhcmlhdGVzX2RyZWRnZS5kdF9wcmVkaWN0aW9uc19jb25zaXN0ZW50dGVtcGZpc2hpbmdpbnJlZykgKwogIGdlb21fcG9pbnQoYWVzKHggPSB5ZWFyLCB5ID0gYW5udWFsX2Rpc3NpbWlsYXJpdHlfdmFsdWUsIGNvbG9yID0gc3VydmV5X3VuaXQpKSArCiAgZ2VvbV9saW5lKGFlcyh4ID0geWVhciwgeSA9IHByZWRfZGlzc2ltLCBjb2xvciA9IHN1cnZleV91bml0KSkgKwogIGdlb21fcmliYm9uKGFlcyh4ID0geWVhciwgeW1pbiA9IHByZWRfZGlzc2ltLXByZWRfc2UsIHltYXggPSBwcmVkX2Rpc3NpbStwcmVkX3NlLCBmaWxsID0gc3VydmV5X3VuaXQpLCBhbHBoYSA9IDAuMykgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjb2xvcl9hbHBoYV9vcmRlciwgbGFiZWxzID0gbGFiZWxfYWxwaGFfb3JkZXIsIG5hbWUgPSAiU3VydmV5IikgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGNvbG9yX2FscGhhX29yZGVyLCBsYWJlbHMgPSBsYWJlbF9hbHBoYV9vcmRlciwgbmFtZSA9ICJTdXJ2ZXkiKSArCiAgbGFicyh4ID0gIlllYXIiLHkgPSAiQXZlcmFnZSBhbm51YWwgdG90YWxcbkJyYXkgQ3VydGlzIGRpc3NpbWlsYXJpdHkiKSArCiAgeWxpbSgwLDEuNSkgKwogIHRoZW1lX2NsYXNzaWMoKSArCiAgZ2d0aXRsZSgiQXZlcmFnZSBtb2RlbCBwcmVkaWN0aW9ucyB3aXRoIG1lYW5cbnN1cnZleSB0ZW1wZXJhdHVyZSBhbmQgZmlzaGluZyBwcmVzc3VyZSIpCgojYXZlcmFnZSB0ZW1wIGFuZCBmaXNoaW5nIGFjcm9zcyBhbGwgcmVnaW9ucyAoI0JST0tFTiBOT1QgU1VSRSBXSEFUJ1MgSEFQUEVOSU5HIEhFUkUpCnByZWRpY3RlZF92YWx1ZXNfdGVtcF9maXNoaW5nX21lYW50ZW1wZmlzaGluZyA8LSBnZ3Bsb3QoZGlzc2ltaWxhcml0eV9jb3ZhcmlhdGVzX2RyZWRnZS5kdF9wcmVkaWN0aW9uc19jb25zaXN0ZW50dGVtcGZpc2hpbmcpICsKICBnZW9tX3BvaW50KGFlcyh4ID0geWVhciwgeSA9IGFubnVhbF9kaXNzaW1pbGFyaXR5X3ZhbHVlLCBjb2xvciA9IHN1cnZleV91bml0KSkgKwogIGdlb21fbGluZShhZXMoeCA9IHllYXIsIHkgPSBwcmVkX2Rpc3NpbSwgY29sb3IgPSBzdXJ2ZXlfdW5pdCkpICsKICBnZW9tX3JpYmJvbihhZXMoeCA9IHllYXIsIHltaW4gPSBwcmVkX2Rpc3NpbS1wcmVkX3NlLCB5bWF4ID0gcHJlZF9kaXNzaW0rcHJlZF9zZSwgZmlsbCA9IHN1cnZleV91bml0KSwgYWxwaGEgPSAwLjEpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY29sb3JfYWxwaGFfb3JkZXIsIGxhYmVscyA9IGxhYmVsX2FscGhhX29yZGVyLCBuYW1lID0gIlN1cnZleSIpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjb2xvcl9hbHBoYV9vcmRlciwgbGFiZWxzID0gbGFiZWxfYWxwaGFfb3JkZXIsIG5hbWUgPSAiU3VydmV5IikgKwogIGxhYnMoeCA9ICJZZWFyIix5ID0gIkF2ZXJhZ2UgYW5udWFsIHRvdGFsXG5CcmF5IEN1cnRpcyBkaXNzaW1pbGFyaXR5IikgKwogIHlsaW0oMCwxLjUpICsKICB0aGVtZV9jbGFzc2ljKCkgKwogIGdndGl0bGUoIkF2ZXJhZ2UgbW9kZWwgcHJlZGljdGlvbnMgd2l0aCBtZWFuXG5vdmVyZWFsbCB0ZW1wZXJhdHVyZSBhbmQgZmlzaGluZyBwcmVzc3VyZSIpCgojbWVyZ2UgcGxvdHMKcHJlZGljdGVkX3ZhbHVlc19zYnRfamFjY2FyZF9maXNoaW5nX21lcmdlIDwtIGNvd3Bsb3Q6OnBsb3RfZ3JpZChwcmVkaWN0ZWRfdmFsdWVzX3RlbXBfZmlzaGluZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRpY3RlZF92YWx1ZXNfdGVtcF9maXNoaW5nX21lYW50ZW1wZmlzaGluZ2luc3VydmV5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGljdGVkX3ZhbHVlc190ZW1wX2Zpc2hpbmdfbWVhbnRlbXBmaXNoaW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEpCgpnZ3NhdmUocHJlZGljdGVkX3ZhbHVlc19zYnRfamFjY2FyZF9maXNoaW5nX21lcmdlLCBwYXRoID0gaGVyZTo6aGVyZSgiZmlndXJlcyIpLCBmaWxlbmFtZSA9ICJwcmVkaWN0ZWRfdmFsdWVzX3NidF9qYWNjYXJkX2Zpc2hpbmdfbWVyZ2UuanBnIiwgaGVpZ2h0ID0gMzAsIHdpZHRoID0gMTQpCmBgYAoKVGFrZSBkaXNzaW1pbGFyaXR5IHZhbHVlcyBmcm9tIHJhbmRvbSBub3JtYWwgZGlzdHJpYnV0aW9uIGZvciBlYWNoIHllYXIgZm9yIGVhY2ggcmVnaW9uLCBhbmQgdGhlbiBjYWxjdWxhdGUgc2xvcGUgKDEwMDAgdGltZXMpLiBEbyB0aGlzIGZvcjoKIC0gRmlzaGluZyBhbmQgdGVtcGVyYXR1cmUgdmFyeSBpbnRlcmFubnVhbGx5IHdpdGhpbiBzdXJ2ZXlzCiAtIFRlbXBlcmF0dXJlIGlzIGhlbGQgY29uc3RhbnQgKGFzIG1lYW4gb3ZlciB0aW1lIHNlcmllcyBmb3IgYSBzdXJ2ZXkpLCBidXQgZmlzaGluZyB2YXJpZXMgKGFsbG93cyB1cyB0byBsb29rIGF0IHJlbGF0aXZlIHZhcmlhbmNlIGV4cGxhaW5lZCkKIC0gRmlzaGluZyBpcyBoZWxkIGNvbnN0YW50IChhcyBtZWFuIG92ZXIgdGltZSBzZXJpZXMgZm9yIGEgc3VydmV5KSwgYnV0IHRlbXBlcmF0dXJlIHZhcmllcyAoYWxsb3dzIHVzIHRvIGxvb2sgYXQgcmVsYXRpdmUgdmFyaWFuY2UgZXhwbGFpbmVkKQogLSBCb3RoIGZpc2hpbmcgYW5kIHRlbXBlcmF0dXJlIGhlbGQgY29uc3RhbnQgKGFsbG93cyB1cyB0byBzZWUgcm9sZSBvZiBvdGhlciBjb21wb25lbnRzIG9mIHRoZSBtb2RlbCkKIApgYGB7cn0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKI2Z1bGwgcHJlZGljdGlvbnMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKI3RhYmxlIHdpdGggcHJlZGljdGVkIGRpc3NpbWlsYXJpdHkgdmFsdWVzIGFuZCBzdGFuZGFyZCBlcnJvciBvZiBhbGwgcHJlZGljdGVkIGRpc3NpbWlsYXJpdHkgdmFsdWVzIChieSB5ZWFyKQp0YWJsZSA8LSBkaXNzaW1pbGFyaXR5X2NvdmFyaWF0ZXNfZHJlZGdlLmR0X3ByZWRpY3Rpb25zWywuKHN1cnZleV91bml0LCBwcmVkX2Rpc3NpbSwgcHJlZF9zZSwgeWVhcildCiMwKSBtYWtlIGRhdGF0YWJsZSB0byBwb3B1bGF0ZQogIHByZWRpY3RlZF9kaXNzaW1fdHJlbmRzX3Jub3JtcnVucyA8LSBkYXRhLnRhYmxlKCkKIzEpIE5FVyBQUkVESUNURUQgVkFMVUVTIEZST00gRElTVFJJQlVUSU9OCmZvciAoaSBpbiAxOjEwMDApewogIHRhYmxlWyxybm9ybV9wcmVkIDo9IHJub3JtKDEsIG1lYW4gPSBwcmVkX2Rpc3NpbSwgc2QgPSBwcmVkX3NlKSwuKHllYXIsIHN1cnZleV91bml0KV0KIzIpIENBTENVTEFURSBMSU5FQVIgTU9ERUwgVE8gRVhUUkFDVCBTVVJWRVkgU1BFQ0lGSUMgVFJFTkQgVkFMVUVTCiAgamFjY2FyZF90b3RhbF9wcmVkaWN0ZWRfbG1fc2luZ2xlcnVuIDwtIGxtKHJub3JtX3ByZWQgfiB5ZWFyKnN1cnZleV91bml0LGRhdGEgPSB0YWJsZSkKCiAgbW9kZWxfY29lZnNfcmVkdWNlZF9wcmVkaWN0aW9uc19zaW5nbGVydW4gPC0gZGF0YS50YWJsZShzdW1tYXJ5KGphY2NhcmRfdG90YWxfcHJlZGljdGVkX2xtX3NpbmdsZXJ1bikkY29lZmZpY2llbnRzKQogIG1vZGVsX2NvZWZzX3JlZHVjZWRfcHJlZGljdGlvbnNfc2luZ2xlcnVuWyx2YXIgOj0gcm93bmFtZXMoc3VtbWFyeShqYWNjYXJkX3RvdGFsX3ByZWRpY3RlZF9sbV9zaW5nbGVydW4pJGNvZWZmaWNpZW50cyldCiAgCiAgI2xpbWl0IHRvIGludGVyYWN0aW9ucyBvbmx5IChjaGVjayB0aGlzIGlmIHRoZXJlIGFyZSBhbnkgbW9kZWwgY2hhbmdlcyEpIHJvdyAyIGFuZCByb3dzIDM0OjY0CiAgbW9kZWxfY29lZnNfcmVkdWNlZF9wcmVkaWN0aW9uc19zaW5nbGVydW4gPC0gbW9kZWxfY29lZnNfcmVkdWNlZF9wcmVkaWN0aW9uc19zaW5nbGVydW5bYygyLDM0OjY0KSxdCiAgCiAgI2FkanVzdCBzdXJ2ZXkgdW5pdCBuYW1lIGJ5IGRlbGV0aW5nIGJlZ2lubmluZyBvZiBzdHJpbmcKICBtb2RlbF9jb2Vmc19yZWR1Y2VkX3ByZWRpY3Rpb25zX3NpbmdsZXJ1blssc3VydmV5X3VuaXQgOj0gc3Vic3RyKHZhciwgMTcsIHN0cl9sZW5ndGgodmFyKSldW3ZhciA9PSAieWVhciIsc3VydmV5X3VuaXQgOj0gIkFJIl0KICAKICAjY2FsY3VsYXRlIGludGVyYWN0aW9uIGNvZWZmaWNpZW50cwogIEFJX2VzdGltYXRlIDwtIG1vZGVsX2NvZWZzX3JlZHVjZWRfcHJlZGljdGlvbnNfc2luZ2xlcnVuWzEsRXN0aW1hdGVdCiAgbW9kZWxfY29lZnNfcmVkdWNlZF9wcmVkaWN0aW9uc19zaW5nbGVydW5bMSxlc3RpbWF0ZSA6PSBBSV9lc3RpbWF0ZV0KICBtb2RlbF9jb2Vmc19yZWR1Y2VkX3ByZWRpY3Rpb25zX3NpbmdsZXJ1blsyOjMyLGVzdGltYXRlIDo9IChBSV9lc3RpbWF0ZSArIEVzdGltYXRlKV0KICAKICBwcmVkaWN0ZWRfZGlzc2ltX3RyZW5kc19ybm9ybXJ1bnMgPC0gcmJpbmQocHJlZGljdGVkX2Rpc3NpbV90cmVuZHNfcm5vcm1ydW5zLCBtb2RlbF9jb2Vmc19yZWR1Y2VkX3ByZWRpY3Rpb25zX3NpbmdsZXJ1blssLihzdXJ2ZXlfdW5pdCwgZXN0aW1hdGUpXSkKICAKICBwcmludChpKQp9CiAgCiNyZWR1Y2UgdG8gbWVhbiBhbmQgc3RhbmRhcmQgZGV2aWF0aW9uCnByZWRpY3RlZF9kaXNzaW1fdHJlbmRzX3Jub3JtcnVuc1ssbWVhbl9kaXNzaW1fY29lZjo9IG1lYW4oZXN0aW1hdGUpLHN1cnZleV91bml0XVssc2RfZGlzc2ltIDo9IHNkKGVzdGltYXRlKSwuKHN1cnZleV91bml0KV0KCnByZWRpY3RlZF9kaXNzaW1fdHJlbmRzX3Jub3JtcnVucy5zdW1tYXJ5IDwtIHVuaXF1ZShwcmVkaWN0ZWRfZGlzc2ltX3RyZW5kc19ybm9ybXJ1bnNbLC4oc3VydmV5X3VuaXQsIG1lYW5fZGlzc2ltX2NvZWYsIHNkX2Rpc3NpbSldKQoKcHJlZGljdGVkX2Rpc3NpbV90cmVuZHNfcm5vcm1ydW5zLnN1bW1hcnlbLHByZWRfdHlwZSA6PSAiZnVsbCJdCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojcHJlZGljdGlvbnMgd2l0aCB0ZW1wIGhlbGQgY29uc3RhbnQgYW5kIGZpc2hpbmcgc3RpbGwgdmFyeWluZyBmcm9tIHllYXIgdG8geWVhcgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojdGFibGUgd2l0aCBwcmVkaWN0ZWQgZGlzc2ltaWxhcml0eSB2YWx1ZXMgYW5kIHN0YW5kYXJkIGVycm9yIG9mIGFsbCBwcmVkaWN0ZWQgZGlzc2ltaWxhcml0eSB2YWx1ZXMgKGJ5IHllYXIpCnRhYmxlX2NvbnN0YW50dGVtcCA8LSBkaXNzaW1pbGFyaXR5X2NvdmFyaWF0ZXNfZHJlZGdlLmR0X3ByZWRpY3Rpb25zX2NvbnNpc3RlbnR0ZW1waW5yZWdbLC4oc3VydmV5X3VuaXQsIHByZWRfZGlzc2ltLCBwcmVkX3NlLCB5ZWFyKV0KIzApIG1ha2UgZGF0YXRhYmxlIHRvIHBvcHVsYXRlCiAgcHJlZGljdGVkX2Rpc3NpbV90cmVuZHNfcm5vcm1ydW5zX2NvbnN0YW50dGVtcCA8LSBkYXRhLnRhYmxlKCkKIzEpIE5FVyBQUkVESUNURUQgVkFMVUVTIEZST00gRElTVFJJQlVUSU9OCmZvciAoaSBpbiAxOjEwMDApewogIHRhYmxlX2NvbnN0YW50dGVtcFsscm5vcm1fcHJlZCA6PSBybm9ybSgxLCBtZWFuID0gcHJlZF9kaXNzaW0sIHNkID0gcHJlZF9zZSksLih5ZWFyLCBzdXJ2ZXlfdW5pdCldCiMyKSBDQUxDVUxBVEUgTElORUFSIE1PREVMIEZPUiBTTE9QRSBWQUxVRVMKICBqYWNjYXJkX3RvdGFsX3ByZWRpY3RlZF9sbV9zaW5nbGVydW5fY29uc3RhbnR0ZW1wIDwtIGxtKHJub3JtX3ByZWQgfiB5ZWFyKnN1cnZleV91bml0LGRhdGEgPSB0YWJsZV9jb25zdGFudHRlbXApCgogIG1vZGVsX2NvZWZzX3JlZHVjZWRfcHJlZGljdGlvbnNfc2luZ2xlcnVuX2NvbnN0YW50dGVtcCA8LSBkYXRhLnRhYmxlKHN1bW1hcnkoamFjY2FyZF90b3RhbF9wcmVkaWN0ZWRfbG1fc2luZ2xlcnVuX2NvbnN0YW50dGVtcCkkY29lZmZpY2llbnRzKQogIG1vZGVsX2NvZWZzX3JlZHVjZWRfcHJlZGljdGlvbnNfc2luZ2xlcnVuX2NvbnN0YW50dGVtcFssdmFyIDo9IHJvd25hbWVzKHN1bW1hcnkoamFjY2FyZF90b3RhbF9wcmVkaWN0ZWRfbG1fc2luZ2xlcnVuX2NvbnN0YW50dGVtcCkkY29lZmZpY2llbnRzKV0KICAKICAjbGltaXQgdG8gaW50ZXJhY3Rpb25zIG9ubHkgKGNoZWNrIHRoaXMgaWYgdGhlcmUgYXJlIGFueSBtb2RlbCBjaGFuZ2VzISkgcm93IDIgYW5kIHJvd3MgMzQ6NjQKICBtb2RlbF9jb2Vmc19yZWR1Y2VkX3ByZWRpY3Rpb25zX3NpbmdsZXJ1bl9jb25zdGFudHRlbXAgPC0gbW9kZWxfY29lZnNfcmVkdWNlZF9wcmVkaWN0aW9uc19zaW5nbGVydW5fY29uc3RhbnR0ZW1wW2MoMiwzNDo2NCksXQogIAogICNhZGp1c3Qgc3VydmV5IHVuaXQgbmFtZSBieSBkZWxldGluZyBiZWdpbm5pbmcgb2Ygc3RyaW5nCiAgbW9kZWxfY29lZnNfcmVkdWNlZF9wcmVkaWN0aW9uc19zaW5nbGVydW5fY29uc3RhbnR0ZW1wWyxzdXJ2ZXlfdW5pdCA6PSBzdWJzdHIodmFyLCAxNywgc3RyX2xlbmd0aCh2YXIpKV1bdmFyID09ICJ5ZWFyIixzdXJ2ZXlfdW5pdCA6PSAiQUkiXQogIAogICNjYWxjdWxhdGUgaW50ZXJhY3Rpb24gY29lZmZpY2llbnRzCiAgQUlfZXN0aW1hdGUgPC0gbW9kZWxfY29lZnNfcmVkdWNlZF9wcmVkaWN0aW9uc19zaW5nbGVydW5fY29uc3RhbnR0ZW1wWzEsRXN0aW1hdGVdCiAgbW9kZWxfY29lZnNfcmVkdWNlZF9wcmVkaWN0aW9uc19zaW5nbGVydW5fY29uc3RhbnR0ZW1wWzEsZXN0aW1hdGUgOj0gQUlfZXN0aW1hdGVdCiAgbW9kZWxfY29lZnNfcmVkdWNlZF9wcmVkaWN0aW9uc19zaW5nbGVydW5fY29uc3RhbnR0ZW1wWzI6MzIsZXN0aW1hdGUgOj0gKEFJX2VzdGltYXRlICsgRXN0aW1hdGUpXQogIAogIHByZWRpY3RlZF9kaXNzaW1fdHJlbmRzX3Jub3JtcnVuc19jb25zdGFudHRlbXAgPC0gcmJpbmQocHJlZGljdGVkX2Rpc3NpbV90cmVuZHNfcm5vcm1ydW5zX2NvbnN0YW50dGVtcCwgbW9kZWxfY29lZnNfcmVkdWNlZF9wcmVkaWN0aW9uc19zaW5nbGVydW5fY29uc3RhbnR0ZW1wWywuKHN1cnZleV91bml0LCBlc3RpbWF0ZSldKQogIAogIHByaW50KGkpCn0KICAKI3JlZHVjZSB0byBtZWFuIGFuZCBzdGFuZGFyZCBkZXZpYXRpb24KcHJlZGljdGVkX2Rpc3NpbV90cmVuZHNfcm5vcm1ydW5zX2NvbnN0YW50dGVtcFssbWVhbl9kaXNzaW1fY29lZjo9IG1lYW4oZXN0aW1hdGUpLHN1cnZleV91bml0XVssc2RfZGlzc2ltIDo9IHNkKGVzdGltYXRlKSwuKHN1cnZleV91bml0KV0KCnByZWRpY3RlZF9kaXNzaW1fdHJlbmRzX3Jub3JtcnVuc2NvbnN0YW50X3RlbXAuc3VtbWFyeSA8LSB1bmlxdWUocHJlZGljdGVkX2Rpc3NpbV90cmVuZHNfcm5vcm1ydW5zX2NvbnN0YW50dGVtcFssLihzdXJ2ZXlfdW5pdCwgbWVhbl9kaXNzaW1fY29lZiwgc2RfZGlzc2ltKV0pCgpwcmVkaWN0ZWRfZGlzc2ltX3RyZW5kc19ybm9ybXJ1bnNjb25zdGFudF90ZW1wLnN1bW1hcnlbLHByZWRfdHlwZSA6PSAidGVtcF9jb25zdGFudCJdCgpwcmVkaWN0ZWRfZGlzc2ltX3RyZW5kc19ybm9ybXJ1bnMuc3VtbWFyeSA8LSByYmluZChwcmVkaWN0ZWRfZGlzc2ltX3RyZW5kc19ybm9ybXJ1bnMuc3VtbWFyeSwgcHJlZGljdGVkX2Rpc3NpbV90cmVuZHNfcm5vcm1ydW5zY29uc3RhbnRfdGVtcC5zdW1tYXJ5KQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKI3ByZWRpY3Rpb25zIHdpdGggZmlzaGluZyBoZWxkIGNvbnN0YW50IChhbmQgdGVtcGVyYXR1cmUgdmFyeWluZykKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKI3RhYmxlIHdpdGggcHJlZGljdGVkIGRpc3NpbWlsYXJpdHkgdmFsdWVzIGFuZCBzdGFuZGFyZCBlcnJvciBvZiBhbGwgcHJlZGljdGVkIGRpc3NpbWlsYXJpdHkgdmFsdWVzIChieSB5ZWFyKQp0YWJsZV9jb25zdGFudGZpc2hpbmcgPC0gZGlzc2ltaWxhcml0eV9jb3ZhcmlhdGVzX2RyZWRnZS5kdF9wcmVkaWN0aW9uc19jb25zaXN0ZW50ZmlzaGluZ2lucmVnWywuKHN1cnZleV91bml0LCBwcmVkX2Rpc3NpbSwgcHJlZF9zZSwgeWVhcildCiMwKSBtYWtlIGRhdGF0YWJsZSB0byBwb3B1bGF0ZQogIHByZWRpY3RlZF9kaXNzaW1fdHJlbmRzX3Jub3JtcnVuc19jb25zdGFudGZpc2hpbmcgPC0gZGF0YS50YWJsZSgpCiMxKSBORVcgUFJFRElDVEVEIFZBTFVFUyBGUk9NIERJU1RSSUJVVElPTgpmb3IgKGkgaW4gMToxMDAwKXsKICB0YWJsZV9jb25zdGFudGZpc2hpbmdbLHJub3JtX3ByZWQgOj0gcm5vcm0oMSwgbWVhbiA9IHByZWRfZGlzc2ltLCBzZCA9IHByZWRfc2UpLC4oeWVhciwgc3VydmV5X3VuaXQpXQojMikgQ0FMQ1VMQVRFIExJTkVBUiBNT0RFTCBGT1IgU0xPUEUgVkFMVUVTCiAgamFjY2FyZF90b3RhbF9wcmVkaWN0ZWRfbG1fc2luZ2xlcnVuX2NvbnN0YW50ZmlzaGluZyA8LSBsbShybm9ybV9wcmVkIH4geWVhcipzdXJ2ZXlfdW5pdCxkYXRhID0gdGFibGVfY29uc3RhbnRmaXNoaW5nKQoKICBtb2RlbF9jb2Vmc19yZWR1Y2VkX3ByZWRpY3Rpb25zX3NpbmdsZXJ1bl9jb25zdGFudGZpc2hpbmcgPC0gZGF0YS50YWJsZShzdW1tYXJ5KGphY2NhcmRfdG90YWxfcHJlZGljdGVkX2xtX3NpbmdsZXJ1bl9jb25zdGFudGZpc2hpbmcpJGNvZWZmaWNpZW50cykKICBtb2RlbF9jb2Vmc19yZWR1Y2VkX3ByZWRpY3Rpb25zX3NpbmdsZXJ1bl9jb25zdGFudGZpc2hpbmdbLHZhciA6PSByb3duYW1lcyhzdW1tYXJ5KGphY2NhcmRfdG90YWxfcHJlZGljdGVkX2xtX3NpbmdsZXJ1bl9jb25zdGFudGZpc2hpbmcpJGNvZWZmaWNpZW50cyldCiAgCiAgI2xpbWl0IHRvIGludGVyYWN0aW9ucyBvbmx5IChjaGVjayB0aGlzIGlmIHRoZXJlIGFyZSBhbnkgbW9kZWwgY2hhbmdlcyEpIHJvdyAyIGFuZCByb3dzIDM0OjY0CiAgbW9kZWxfY29lZnNfcmVkdWNlZF9wcmVkaWN0aW9uc19zaW5nbGVydW5fY29uc3RhbnRmaXNoaW5nIDwtIG1vZGVsX2NvZWZzX3JlZHVjZWRfcHJlZGljdGlvbnNfc2luZ2xlcnVuX2NvbnN0YW50ZmlzaGluZ1tjKDIsMzQ6NjQpLF0KICAKICAjYWRqdXN0IHN1cnZleSB1bml0IG5hbWUgYnkgZGVsZXRpbmcgYmVnaW5uaW5nIG9mIHN0cmluZwogIG1vZGVsX2NvZWZzX3JlZHVjZWRfcHJlZGljdGlvbnNfc2luZ2xlcnVuX2NvbnN0YW50ZmlzaGluZ1ssc3VydmV5X3VuaXQgOj0gc3Vic3RyKHZhciwgMTcsIHN0cl9sZW5ndGgodmFyKSldW3ZhciA9PSAieWVhciIsc3VydmV5X3VuaXQgOj0gIkFJIl0KICAKICAjY2FsY3VsYXRlIGludGVyYWN0aW9uIGNvZWZmaWNpZW50cwogIEFJX2VzdGltYXRlIDwtIG1vZGVsX2NvZWZzX3JlZHVjZWRfcHJlZGljdGlvbnNfc2luZ2xlcnVuX2NvbnN0YW50ZmlzaGluZ1sxLEVzdGltYXRlXQogIG1vZGVsX2NvZWZzX3JlZHVjZWRfcHJlZGljdGlvbnNfc2luZ2xlcnVuX2NvbnN0YW50ZmlzaGluZ1sxLGVzdGltYXRlIDo9IEFJX2VzdGltYXRlXQogIG1vZGVsX2NvZWZzX3JlZHVjZWRfcHJlZGljdGlvbnNfc2luZ2xlcnVuX2NvbnN0YW50ZmlzaGluZ1syOjMyLGVzdGltYXRlIDo9IChBSV9lc3RpbWF0ZSArIEVzdGltYXRlKV0KICAKICBwcmVkaWN0ZWRfZGlzc2ltX3RyZW5kc19ybm9ybXJ1bnNfY29uc3RhbnRmaXNoaW5nIDwtIHJiaW5kKHByZWRpY3RlZF9kaXNzaW1fdHJlbmRzX3Jub3JtcnVuc19jb25zdGFudGZpc2hpbmcsIG1vZGVsX2NvZWZzX3JlZHVjZWRfcHJlZGljdGlvbnNfc2luZ2xlcnVuX2NvbnN0YW50ZmlzaGluZ1ssLihzdXJ2ZXlfdW5pdCwgZXN0aW1hdGUpXSkKICAKICBwcmludChpKQp9CiAgCiNyZWR1Y2UgdG8gbWVhbiBhbmQgc3RhbmRhcmQgZGV2aWF0aW9uCnByZWRpY3RlZF9kaXNzaW1fdHJlbmRzX3Jub3JtcnVuc19jb25zdGFudGZpc2hpbmdbLG1lYW5fZGlzc2ltX2NvZWY6PSBtZWFuKGVzdGltYXRlKSxzdXJ2ZXlfdW5pdF1bLHNkX2Rpc3NpbSA6PSBzZChlc3RpbWF0ZSksLihzdXJ2ZXlfdW5pdCldCgpwcmVkaWN0ZWRfZGlzc2ltX3RyZW5kc19ybm9ybXJ1bnNjb25zdGFudF9maXNoaW5nLnN1bW1hcnkgPC0gdW5pcXVlKHByZWRpY3RlZF9kaXNzaW1fdHJlbmRzX3Jub3JtcnVuc19jb25zdGFudGZpc2hpbmdbLC4oc3VydmV5X3VuaXQsIG1lYW5fZGlzc2ltX2NvZWYsIHNkX2Rpc3NpbSldKQoKcHJlZGljdGVkX2Rpc3NpbV90cmVuZHNfcm5vcm1ydW5zY29uc3RhbnRfZmlzaGluZy5zdW1tYXJ5WyxwcmVkX3R5cGUgOj0gImZpc2hpbmdfY29uc3RhbnQiXQoKcHJlZGljdGVkX2Rpc3NpbV90cmVuZHNfcm5vcm1ydW5zLnN1bW1hcnkgPC0gcmJpbmQocHJlZGljdGVkX2Rpc3NpbV90cmVuZHNfcm5vcm1ydW5zLnN1bW1hcnksIHByZWRpY3RlZF9kaXNzaW1fdHJlbmRzX3Jub3JtcnVuc2NvbnN0YW50X2Zpc2hpbmcuc3VtbWFyeSkKCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojcHJlZGljdGlvbnMgd2l0aCBib3RoIGZpc2hpbmcgYW5kIHRlbXBlcmF0dXJlIGhlbGQgY29uc3RhbnQgKHZhcmlhYmlsaXR5IGdvZXMgdG8gb3RoZXIgZmFjdG9ycyB3ZSBkb24ndCBhY2NvdW50IGZvcikKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKI3RhYmxlIHdpdGggcHJlZGljdGVkIGRpc3NpbWlsYXJpdHkgdmFsdWVzIGFuZCBzdGFuZGFyZCBlcnJvciBvZiBhbGwgcHJlZGljdGVkIGRpc3NpbWlsYXJpdHkgdmFsdWVzIChieSB5ZWFyKQp0YWJsZV9jb25zdGFudHRlbXBmaXNoaW5nIDwtIGRpc3NpbWlsYXJpdHlfY292YXJpYXRlc19kcmVkZ2UuZHRfcHJlZGljdGlvbnNfY29uc2lzdGVudHRlbXBmaXNoaW5naW5yZWdbLC4oc3VydmV5X3VuaXQsIHByZWRfZGlzc2ltLCBwcmVkX3NlLCB5ZWFyKV0KIzApIG1ha2UgZGF0YXRhYmxlIHRvIHBvcHVsYXRlCiAgcHJlZGljdGVkX2Rpc3NpbV90cmVuZHNfcm5vcm1ydW5zX2NvbnN0YW50dGVtcGZpc2hpbmcgPC0gZGF0YS50YWJsZSgpCiMxKSBORVcgUFJFRElDVEVEIFZBTFVFUyBGUk9NIERJU1RSSUJVVElPTgpmb3IgKGkgaW4gMToxMDAwKXsKICB0YWJsZV9jb25zdGFudHRlbXBmaXNoaW5nWyxybm9ybV9wcmVkIDo9IHJub3JtKDEsIG1lYW4gPSBwcmVkX2Rpc3NpbSwgc2QgPSBwcmVkX3NlKSwuKHllYXIsIHN1cnZleV91bml0KV0KIzIpIENBTENVTEFURSBMSU5FQVIgTU9ERUwgRk9SIFNMT1BFIFZBTFVFUwogIGphY2NhcmRfdG90YWxfcHJlZGljdGVkX2xtX3NpbmdsZXJ1bl9jb25zdGFudHRlbXBmaXNoaW5nIDwtIGxtKHJub3JtX3ByZWQgfiB5ZWFyKnN1cnZleV91bml0LGRhdGEgPSB0YWJsZV9jb25zdGFudHRlbXBmaXNoaW5nKQoKICBtb2RlbF9jb2Vmc19yZWR1Y2VkX3ByZWRpY3Rpb25zX3NpbmdsZXJ1bl9jb25zdGFudHRlbXBmaXNoaW5nIDwtIGRhdGEudGFibGUoc3VtbWFyeShqYWNjYXJkX3RvdGFsX3ByZWRpY3RlZF9sbV9zaW5nbGVydW5fY29uc3RhbnR0ZW1wZmlzaGluZykkY29lZmZpY2llbnRzKQogIG1vZGVsX2NvZWZzX3JlZHVjZWRfcHJlZGljdGlvbnNfc2luZ2xlcnVuX2NvbnN0YW50dGVtcGZpc2hpbmdbLHZhciA6PSByb3duYW1lcyhzdW1tYXJ5KGphY2NhcmRfdG90YWxfcHJlZGljdGVkX2xtX3NpbmdsZXJ1bl9jb25zdGFudHRlbXBmaXNoaW5nKSRjb2VmZmljaWVudHMpXQogIAogICNsaW1pdCB0byBpbnRlcmFjdGlvbnMgb25seSAoY2hlY2sgdGhpcyBpZiB0aGVyZSBhcmUgYW55IG1vZGVsIGNoYW5nZXMhKSByb3cgMiBhbmQgcm93cyAzNDo2NAogIG1vZGVsX2NvZWZzX3JlZHVjZWRfcHJlZGljdGlvbnNfc2luZ2xlcnVuX2NvbnN0YW50dGVtcGZpc2hpbmcgPC0gbW9kZWxfY29lZnNfcmVkdWNlZF9wcmVkaWN0aW9uc19zaW5nbGVydW5fY29uc3RhbnR0ZW1wZmlzaGluZ1tjKDIsMzQ6NjQpLF0KICAKICAjYWRqdXN0IHN1cnZleSB1bml0IG5hbWUgYnkgZGVsZXRpbmcgYmVnaW5uaW5nIG9mIHN0cmluZwogIG1vZGVsX2NvZWZzX3JlZHVjZWRfcHJlZGljdGlvbnNfc2luZ2xlcnVuX2NvbnN0YW50dGVtcGZpc2hpbmdbLHN1cnZleV91bml0IDo9IHN1YnN0cih2YXIsIDE3LCBzdHJfbGVuZ3RoKHZhcikpXVt2YXIgPT0gInllYXIiLHN1cnZleV91bml0IDo9ICJBSSJdCiAgCiAgI2NhbGN1bGF0ZSBpbnRlcmFjdGlvbiBjb2VmZmljaWVudHMKICBBSV9lc3RpbWF0ZSA8LSBtb2RlbF9jb2Vmc19yZWR1Y2VkX3ByZWRpY3Rpb25zX3NpbmdsZXJ1bl9jb25zdGFudHRlbXBmaXNoaW5nWzEsRXN0aW1hdGVdCiAgbW9kZWxfY29lZnNfcmVkdWNlZF9wcmVkaWN0aW9uc19zaW5nbGVydW5fY29uc3RhbnR0ZW1wZmlzaGluZ1sxLGVzdGltYXRlIDo9IEFJX2VzdGltYXRlXQogIG1vZGVsX2NvZWZzX3JlZHVjZWRfcHJlZGljdGlvbnNfc2luZ2xlcnVuX2NvbnN0YW50dGVtcGZpc2hpbmdbMjozMixlc3RpbWF0ZSA6PSAoQUlfZXN0aW1hdGUgKyBFc3RpbWF0ZSldCiAgCiAgcHJlZGljdGVkX2Rpc3NpbV90cmVuZHNfcm5vcm1ydW5zX2NvbnN0YW50dGVtcGZpc2hpbmcgPC0gcmJpbmQocHJlZGljdGVkX2Rpc3NpbV90cmVuZHNfcm5vcm1ydW5zX2NvbnN0YW50dGVtcGZpc2hpbmcsIG1vZGVsX2NvZWZzX3JlZHVjZWRfcHJlZGljdGlvbnNfc2luZ2xlcnVuX2NvbnN0YW50dGVtcGZpc2hpbmdbLC4oc3VydmV5X3VuaXQsIGVzdGltYXRlKV0pCiAgCiAgcHJpbnQoaSkKfQogIAojcmVkdWNlIHRvIG1lYW4gYW5kIHN0YW5kYXJkIGRldmlhdGlvbgpwcmVkaWN0ZWRfZGlzc2ltX3RyZW5kc19ybm9ybXJ1bnNfY29uc3RhbnR0ZW1wZmlzaGluZ1ssbWVhbl9kaXNzaW1fY29lZjo9IG1lYW4oZXN0aW1hdGUpLHN1cnZleV91bml0XVssc2RfZGlzc2ltIDo9IHNkKGVzdGltYXRlKSwuKHN1cnZleV91bml0KV0KCnByZWRpY3RlZF9kaXNzaW1fdHJlbmRzX3Jub3JtcnVuc2NvbnN0YW50X3RlbXBmaXNoaW5nLnN1bW1hcnkgPC0gdW5pcXVlKHByZWRpY3RlZF9kaXNzaW1fdHJlbmRzX3Jub3JtcnVuc19jb25zdGFudHRlbXBmaXNoaW5nWywuKHN1cnZleV91bml0LCBtZWFuX2Rpc3NpbV9jb2VmLCBzZF9kaXNzaW0pXSkKCnByZWRpY3RlZF9kaXNzaW1fdHJlbmRzX3Jub3JtcnVuc2NvbnN0YW50X3RlbXBmaXNoaW5nLnN1bW1hcnlbLHByZWRfdHlwZSA6PSAiZmlzaGluZ19hbmRfdGVtcF9jb25zdGFudCJdCgpwcmVkaWN0ZWRfZGlzc2ltX3RyZW5kc19ybm9ybXJ1bnMuc3VtbWFyeSA8LSByYmluZChwcmVkaWN0ZWRfZGlzc2ltX3RyZW5kc19ybm9ybXJ1bnMuc3VtbWFyeSwgcHJlZGljdGVkX2Rpc3NpbV90cmVuZHNfcm5vcm1ydW5zY29uc3RhbnRfdGVtcGZpc2hpbmcuc3VtbWFyeSkKYGBgCgpQbG90dGluZyBvYnNlcnZlZCB2cyBwcmVkaWN0ZWQKYGBge3J9CgpqYWNjYXJkX2Zpc2hpbmdfdGVtcF9tb2RlbF9vYnNlcnZlZF9wcmVkaWN0ZWRfZHQgPC0gamFjY2FyZF90b3RhbF9jb2Vmcy5yW3ByZWRpY3RlZF9kaXNzaW1fdHJlbmRzX3Jub3JtcnVucy5zdW1tYXJ5LCBvbiA9ICJzdXJ2ZXlfdW5pdCJdCgpqYWNjYXJkX2Zpc2hpbmdfdGVtcF9tb2RlbF9vYnNlcnZlZF9wcmVkaWN0ZWRfZHRbLHByZWRfbG93ZXIgOj0gbWVhbl9kaXNzaW1fY29lZi1zZF9kaXNzaW1dWyxwcmVkX3VwcGVyIDo9IG1lYW5fZGlzc2ltX2NvZWYrc2RfZGlzc2ltXQoKI0ZVTEwgTU9ERUwsIGJvdGggdGVtcGVyYXR1cmUgYW5kIGZpc2hpbmcgYXJlIGFsbG93ZWQgdG8gdmFyeQpqYWNjYXJkX2Zpc2hpbmdfdGVtcF9tb2RlbF9vYnNlcnZlZF9wcmVkaWN0ZWRfbG0gPC0gbG0oZXN0aW1hdGUgfiBtZWFuX2Rpc3NpbV9jb2VmLCBkYXRhID0gamFjY2FyZF9maXNoaW5nX3RlbXBfbW9kZWxfb2JzZXJ2ZWRfcHJlZGljdGVkX2R0W3ByZWRfdHlwZSA9PSAiZnVsbCJdKQpzdW1tYXJ5KGphY2NhcmRfZmlzaGluZ190ZW1wX21vZGVsX29ic2VydmVkX3ByZWRpY3RlZF9sbSkgI1JeMiAwLjU2CgooamFjY2FyZF9maXNoaW5nX3RlbXBfbW9kZWxfb2JzZXJ2ZWRfcHJlZGljdGVkIDwtIGdncGxvdChqYWNjYXJkX2Zpc2hpbmdfdGVtcF9tb2RlbF9vYnNlcnZlZF9wcmVkaWN0ZWRfZHRbcHJlZF90eXBlID09ICJmdWxsIl0pICsKICBnZW9tX2Vycm9yYmFyKGFlcyh4ID0gbWVhbl9kaXNzaW1fY29lZiwgeW1pbiA9IGx3ciwgeW1heCA9IHVwciksIGNvbG9yID0gImxpZ2h0Z3JleSIsIGxpbmV3aWR0aCA9IDAuNCkgKwogIGdlb21fZXJyb3JiYXJoKGFlcyh5ID0gZXN0aW1hdGUsIHhtaW4gPSBtZWFuX2Rpc3NpbV9jb2VmLXNkX2Rpc3NpbSwgeG1heCA9IG1lYW5fZGlzc2ltX2NvZWYrc2RfZGlzc2ltKSwgY29sb3IgPSAibGlnaHRncmV5IiwgbGluZXdpZHRoID0gMC40KSArCiAgZ2VvbV9wb2ludChhZXMoeSA9IGVzdGltYXRlLCB4ID0gbWVhbl9kaXNzaW1fY29lZikpICsKICBnZW9tX3Ntb290aChhZXMoeSA9IGVzdGltYXRlLCB4ID0gbWVhbl9kaXNzaW1fY29lZiksIGNvbG9yID0gImRhcmtncmV5IixsaW5ldHlwZSA9ICJkb3R0ZWQiLCBtZXRob2QgPSAibG0iKSArCiAgZ2VvbV9hYmxpbmUoYWVzKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCkpICsKICBsaW1zKHggPSBjKG1pbihqYWNjYXJkX2Zpc2hpbmdfdGVtcF9tb2RlbF9vYnNlcnZlZF9wcmVkaWN0ZWRfZHQkcHJlZF9sb3dlciksbWF4KGphY2NhcmRfZmlzaGluZ190ZW1wX21vZGVsX29ic2VydmVkX3ByZWRpY3RlZF9kdCRwcmVkX3VwcGVyKSkpICsKICBsYWJzKHkgPSAiT2JzZXJ2ZWQgzrItZGl2ZXJzaXR5IHRyZW5kIix4ID0gIlByZWRpY3RlZCDOsi1kaXZlcnNpdHkgdHJlbmRcbiIpICsKICB0aGVtZV9jbGFzc2ljKCkKKQoKI2Zpc2hpbmcgY29uc3RhbnQgKGZpc2hpbmcgY29uc3RhbnQ7IHRlbXBlcmF0dXJlIHZhcmllcyBvbmx5KQpqYWNjYXJkX2Zpc2hpbmdfY29uc3RhbnRfbW9kZWxfb2JzZXJ2ZWRfcHJlZGljdGVkX2xtIDwtIGxtKGVzdGltYXRlIH4gbWVhbl9kaXNzaW1fY29lZiwgZGF0YSA9IGphY2NhcmRfZmlzaGluZ190ZW1wX21vZGVsX29ic2VydmVkX3ByZWRpY3RlZF9kdFtwcmVkX3R5cGUgPT0gImZpc2hpbmdfY29uc3RhbnQiXSkKc3VtbWFyeShqYWNjYXJkX2Zpc2hpbmdfY29uc3RhbnRfbW9kZWxfb2JzZXJ2ZWRfcHJlZGljdGVkX2xtKSAKI1RlbXBlcmF0dXJlIGFzIGEgcHJlZGljdG9yLCBub3QgZmlzaGluZyA9IFJeMiA9IDAuNDAgKGRyb3AgaW4gMTYlIG9mIHZhcmlhbmNlIGV4cGxhaW5lZCB3aGVuIHlvdSBsb3NlIGZpc2hpbmcgYXMgcHJlZGljdG9yKQoKKGphY2NhcmRfZmlzaGluZ19jb25zdGFudF9tb2RlbF9vYnNlcnZlZF9wcmVkaWN0ZWQgPC0gZ2dwbG90KGphY2NhcmRfZmlzaGluZ190ZW1wX21vZGVsX29ic2VydmVkX3ByZWRpY3RlZF9kdFtwcmVkX3R5cGUgPT0gImZpc2hpbmdfY29uc3RhbnQiXSkgKwpnZW9tX2Vycm9yYmFyKGFlcyh4ID0gbWVhbl9kaXNzaW1fY29lZiwgeW1pbiA9IGx3ciwgeW1heCA9IHVwciksIGNvbG9yID0gImxpZ2h0Z3JleSIsIGxpbmV3aWR0aCA9IDAuNCkgKwogIGdlb21fZXJyb3JiYXJoKGFlcyh5ID0gZXN0aW1hdGUsIHhtaW4gPSBtZWFuX2Rpc3NpbV9jb2VmLXNkX2Rpc3NpbSwgeG1heCA9IG1lYW5fZGlzc2ltX2NvZWYrc2RfZGlzc2ltKSwgY29sb3IgPSAibGlnaHRncmV5IiwgbGluZXdpZHRoID0gMC40KSArCiAgZ2VvbV9wb2ludChhZXMoeSA9IGVzdGltYXRlLCB4ID0gbWVhbl9kaXNzaW1fY29lZikpICsKICAgIGdlb21fc21vb3RoKGFlcyh5ID0gZXN0aW1hdGUsIHggPSBtZWFuX2Rpc3NpbV9jb2VmKSwgY29sb3IgPSAiZGFya2dyZXkiLGxpbmV0eXBlID0gImRvdHRlZCIsIG1ldGhvZCA9ICJsbSIpICsKICBnZW9tX2FibGluZShhZXMoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwKSkgKwogICAgICBsaW1zKHggPSBjKG1pbihqYWNjYXJkX2Zpc2hpbmdfdGVtcF9tb2RlbF9vYnNlcnZlZF9wcmVkaWN0ZWRfZHQkcHJlZF9sb3dlciksbWF4KGphY2NhcmRfZmlzaGluZ190ZW1wX21vZGVsX29ic2VydmVkX3ByZWRpY3RlZF9kdCRwcmVkX3VwcGVyKSkpICsKICBsYWJzKHkgPSAiT2JzZXJ2ZWQgzrItZGl2ZXJzaXR5IHRyZW5kIix4ID0gIlByZWRpY3RlZCDOsi1kaXZlcnNpdHkgdHJlbmRcbih0ZW1wZXJhdHVyZSB2YXJpZXMgZmlzaGluZyBjb25zdGFudCkiKSArCiAgdGhlbWVfY2xhc3NpYygpCikKCiN0ZW1wIGNvbnN0YW50IChmaXNoaW5nIG9ubHk7IHRlbXBlcmF0dXJlIGNvbnN0YW50KQpqYWNjYXJkX3RlbXBlcmF0dXJlX2NvbnN0YW50X21vZGVsX29ic2VydmVkX3ByZWRpY3RlZF9sbSA8LSBsbShlc3RpbWF0ZSB+IG1lYW5fZGlzc2ltX2NvZWYsIGRhdGEgPSBqYWNjYXJkX2Zpc2hpbmdfdGVtcF9tb2RlbF9vYnNlcnZlZF9wcmVkaWN0ZWRfZHRbcHJlZF90eXBlID09ICJ0ZW1wX2NvbnN0YW50Il0pCnN1bW1hcnkoamFjY2FyZF90ZW1wZXJhdHVyZV9jb25zdGFudF9tb2RlbF9vYnNlcnZlZF9wcmVkaWN0ZWRfbG0pICMwLjI2IERyb3AgaW4gMzAlIG9mIHZhcmlhbmNlIGV4cGxhaW5lZCB3aGVuIHlvdSBsb3NlIHRlbXBlcmF0dXJlIGFzIGEgcHJlZGljdG9yCgooamFjY2FyZF90ZW1wZXJhdHVyZV9jb25zdGFudF9tb2RlbF9vYnNlcnZlZF9wcmVkaWN0ZWQgPC0gZ2dwbG90KGphY2NhcmRfZmlzaGluZ190ZW1wX21vZGVsX29ic2VydmVkX3ByZWRpY3RlZF9kdFtwcmVkX3R5cGUgPT0gInRlbXBfY29uc3RhbnQiXSkgKwogIGdlb21fZXJyb3JiYXIoYWVzKHggPSBtZWFuX2Rpc3NpbV9jb2VmLCB5bWluID0gbHdyLCB5bWF4ID0gdXByKSwgY29sb3IgPSAibGlnaHRncmV5IiwgbGluZXdpZHRoID0gMC40KSArCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHkgPSBlc3RpbWF0ZSwgeG1pbiA9IG1lYW5fZGlzc2ltX2NvZWYtc2RfZGlzc2ltLCB4bWF4ID0gbWVhbl9kaXNzaW1fY29lZitzZF9kaXNzaW0pLCBjb2xvciA9ICJsaWdodGdyZXkiLCBsaW5ld2lkdGggPSAwLjQpICsKICBnZW9tX3BvaW50KGFlcyh5ID0gZXN0aW1hdGUsIHggPSBtZWFuX2Rpc3NpbV9jb2VmKSkgKwogICAgZ2VvbV9zbW9vdGgoYWVzKHkgPSBlc3RpbWF0ZSwgeCA9IG1lYW5fZGlzc2ltX2NvZWYpLCBjb2xvciA9ICJkYXJrZ3JleSIsbGluZXR5cGUgPSAiZG90dGVkIiwgbWV0aG9kID0gImxtIikgKwogIGdlb21fYWJsaW5lKGFlcyhzbG9wZSA9IDEsIGludGVyY2VwdCA9IDApKSArCiAgICAgIGxpbXMoeCA9IGMobWluKGphY2NhcmRfZmlzaGluZ190ZW1wX21vZGVsX29ic2VydmVkX3ByZWRpY3RlZF9kdCRwcmVkX2xvd2VyKSxtYXgoamFjY2FyZF9maXNoaW5nX3RlbXBfbW9kZWxfb2JzZXJ2ZWRfcHJlZGljdGVkX2R0JHByZWRfdXBwZXIpKSkgKwogIGxhYnMoeSA9ICJPYnNlcnZlZCDOsi1kaXZlcnNpdHkgdHJlbmQiLHggPSAiUHJlZGljdGVkIM6yLWRpdmVyc2l0eSB0cmVuZFxuKGZpc2hpbmcgdmFyaWVzIHRlbXBlcmF0dXJlIGNvbnN0YW50KSIpICsKICB0aGVtZV9jbGFzc2ljKCkKKQoKI2JvdGggdGVtcGVyYXR1cmUgYW5kIGZpc2ggaGVsZCBjb25zdGFudApqYWNjYXJkX2Zpc2hpbmdfdGVtcF9tb2RlbF9vYnNlcnZlZF9wcmVkaWN0ZWRfdGVtcGZpc2hjb25zdGFudGluc3VydmV5X2xtIDwtIGxtKGVzdGltYXRlIH4gbWVhbl9kaXNzaW1fY29lZiwgZGF0YSA9IGphY2NhcmRfZmlzaGluZ190ZW1wX21vZGVsX29ic2VydmVkX3ByZWRpY3RlZF9kdFtwcmVkX3R5cGUgPT0gImZpc2hpbmdfYW5kX3RlbXBfY29uc3RhbnQiXSkKc3VtbWFyeShqYWNjYXJkX2Zpc2hpbmdfdGVtcF9tb2RlbF9vYnNlcnZlZF9wcmVkaWN0ZWRfdGVtcGZpc2hjb25zdGFudGluc3VydmV5X2xtKSAjJTIwICNkcm9wIG9mIDM2IGZyb20gZnVsbAoKKGphY2NhcmRfZmlzaGluZ190ZW1wX21vZGVsX29ic2VydmVkX3ByZWRpY3RlZF90ZW1wZmlzaGNvbnN0YW50aW5zdXJ2ZXkgPC0gZ2dwbG90KGphY2NhcmRfZmlzaGluZ190ZW1wX21vZGVsX29ic2VydmVkX3ByZWRpY3RlZF9kdFtwcmVkX3R5cGUgPT0gImZpc2hpbmdfYW5kX3RlbXBfY29uc3RhbnQiXSkgKwpnZW9tX2Vycm9yYmFyKGFlcyh4ID0gbWVhbl9kaXNzaW1fY29lZiwgeW1pbiA9IGx3ciwgeW1heCA9IHVwciksIGNvbG9yID0gImxpZ2h0Z3JleSIsIGxpbmV3aWR0aCA9IDAuNCkgKwogIGdlb21fZXJyb3JiYXJoKGFlcyh5ID0gZXN0aW1hdGUsIHhtaW4gPSBtZWFuX2Rpc3NpbV9jb2VmLXNkX2Rpc3NpbSwgeG1heCA9IG1lYW5fZGlzc2ltX2NvZWYrc2RfZGlzc2ltKSwgY29sb3IgPSAibGlnaHRncmV5IiwgbGluZXdpZHRoID0gMC40KSArCiAgZ2VvbV9wb2ludChhZXMoeSA9IGVzdGltYXRlLCB4ID0gbWVhbl9kaXNzaW1fY29lZikpICsKICAgIGdlb21fc21vb3RoKGFlcyh5ID0gZXN0aW1hdGUsIHggPSBtZWFuX2Rpc3NpbV9jb2VmKSwgY29sb3IgPSAiZGFya2dyZXkiLGxpbmV0eXBlID0gImRvdHRlZCIsIG1ldGhvZCA9ICJsbSIpKwogIGdlb21fYWJsaW5lKGFlcyhzbG9wZSA9IDEsIGludGVyY2VwdCA9IDApKSArCiAgICAgIGxpbXMoeCA9IGMobWluKGphY2NhcmRfZmlzaGluZ190ZW1wX21vZGVsX29ic2VydmVkX3ByZWRpY3RlZF9kdCRwcmVkX2xvd2VyKSxtYXgoamFjY2FyZF9maXNoaW5nX3RlbXBfbW9kZWxfb2JzZXJ2ZWRfcHJlZGljdGVkX2R0JHByZWRfdXBwZXIpKSkgKwogIGxhYnMoeSA9ICJPYnNlcnZlZCDOsi1kaXZlcnNpdHkgdHJlbmQiLHggPSAiUHJlZGljdGVkIM6yLWRpdmVyc2l0eSB0cmVuZFxuKGZpc2hpbmcgYW5kIHRlbXBlcmF0dXJlIGNvbnN0YW50KSIpICsKICB0aGVtZV9jbGFzc2ljKCkKKQoKCiNtZXJnZQpqYWNjYXJkX2Zpc2hpbmdfc2J0X21vZGVsX29ic2VydmVkX3ByZWRpY3RlZF9tZXJnZSA8LSBwbG90X2dyaWQoamFjY2FyZF9maXNoaW5nX3RlbXBfbW9kZWxfb2JzZXJ2ZWRfcHJlZGljdGVkICsgdGhlbWUocGxvdC5tYXJnaW4gPSB1bml0KGMoMC4xLDAuMywwLjEsMC4xKSwiY20iKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphY2NhcmRfZmlzaGluZ19jb25zdGFudF9tb2RlbF9vYnNlcnZlZF9wcmVkaWN0ZWQgKyB0aGVtZShwbG90Lm1hcmdpbiA9IHVuaXQoYygwLjEsMC4zLDAuMSwwLjEpLCJjbSIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamFjY2FyZF90ZW1wZXJhdHVyZV9jb25zdGFudF9tb2RlbF9vYnNlcnZlZF9wcmVkaWN0ZWQgKyB0aGVtZShwbG90Lm1hcmdpbiA9IHVuaXQoYygwLjEsMC4zLDAuMSwwLjEpLCJjbSIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamFjY2FyZF9maXNoaW5nX3RlbXBfbW9kZWxfb2JzZXJ2ZWRfcHJlZGljdGVkX3RlbXBmaXNoY29uc3RhbnRpbnN1cnZleSArIHRoZW1lKHBsb3QubWFyZ2luID0gdW5pdChjKDAuMSwwLjMsMC4xLDAuMSksImNtIikpLCBuY29sID0gMiwgbGFiZWxzID0gYygiYS4iLCJiLiIsImMuIiwiZC4iKSkKCmdnc2F2ZShqYWNjYXJkX2Zpc2hpbmdfc2J0X21vZGVsX29ic2VydmVkX3ByZWRpY3RlZF9tZXJnZSwgcGF0aCA9IGhlcmU6OmhlcmUoImZpZ3VyZXMiKSxmaWxlbmFtZSA9ICJqYWNjYXJkX2Zpc2hpbmdfc2J0X21vZGVsX29ic2VydmVkX3ByZWRpY3RlZF9tZXJnZS5qcGciLCBoZWlnaHQgPTYsIHdpZHRoID0gOCkKCgpgYGAKCiMjI0xldCdzIHZpc3VhbGl6ZSBtb2RlbCBjb2VmZmljaWVudHMgd2l0aCB0ZW1wZXJhdHVyZSBhbmQgZmlzaGluZyAoc2ltaWxhciB0byBmaWd1cmUgMikKYGBge3J9CgojZXh0cmFjdCBjb2VmZmljaWVudHMgdXNpbmcgbGluZWFyIGFsZ2VicmEKaW50ZXJhY3Rpb25fYXZnX21vZGVsX2NvZWYgPC0gZGF0YS50YWJsZShsbV9pbnRlcmFjdGlvbl9jb2VmZmljaWVudHNfc2UobW9kX25hbWUgPSBtb2RlbF9hdmdfZGVsdGE0LCBtb2RlbF9hdmcgPSBULCBTQlRfZmlzaCA9IFQpKQoKI2FkZCBzdXJ2ZXkgbmFtZXMKaW50ZXJhY3Rpb25fYXZnX21vZGVsX2NvZWZbLHN1cnZleV91bml0IDo9IGZhY3RvcihjKGFsbF9zdXJ2ZXlzWyFhbGxfc3VydmV5cyAlaW4lIGMoIlJPQ0tBTEwiLCAiR1NMLVMiKV0sYWxsX3N1cnZleXNbIWFsbF9zdXJ2ZXlzICVpbiUgYygiUk9DS0FMTCIsICJHU0wtUyIpXSkpXQoKI2FkZCBwcmVkaWN0b3IgbmFtZXMKaW50ZXJhY3Rpb25fYXZnX21vZGVsX2NvZWZbLHByZWRpY3RvciA6PSBjKHJlcCgiUmVsYXRpdmUgZmlzaGluZyBjYXRjaCIsMzIpLHJlcCgiTWluaW11bSB0ZW1wZXJhdHVyZSIsMzIpKV0KCiNyZW9yZGVyIHRlbXBlcmF0dXJlIGFuZCBmaXNoaW5nCmludGVyYWN0aW9uX2F2Z19tb2RlbF9jb2VmWyxwcmVkaWN0b3IgOj0gZmFjdG9yKHByZWRpY3RvciwgbGV2ZWxzID0gYygiTWluaW11bSB0ZW1wZXJhdHVyZSIsIlJlbGF0aXZlIGZpc2hpbmcgY2F0Y2giKSldCgojbGluayBmb3IgZnVsbCBzdXJ2ZXkgbmFtZQppbnRlcmFjdGlvbl9hdmdfbW9kZWxfY29lZiA8LSBjb2xvcl9saW5rW2ludGVyYWN0aW9uX2F2Z19tb2RlbF9jb2VmLCBvbiA9ICJzdXJ2ZXlfdW5pdCJdCgojbGlzdCBvZiBTdXJ2ZXkgTmFtZSBTZWFzb24gaW4gb3JkZXIgYnkgc3VydmV5IHVuaXQKc2V0a2V5KGludGVyYWN0aW9uX2F2Z19tb2RlbF9jb2VmLCBzdXJ2ZXlfdW5pdCkKCnN1cnZleV9uYW1lX3NlYXNvbl9vcmRlcmVkIDwtIHVuaXF1ZShpbnRlcmFjdGlvbl9hdmdfbW9kZWxfY29lZiRTdXJ2ZXlfTmFtZV9TZWFzb24pCgojTWFrZSBTdXJ2ZXlfTmFtZV9TZWFzb24gYSBmYWN0b3IKaW50ZXJhY3Rpb25fYXZnX21vZGVsX2NvZWZbLFN1cnZleV9OYW1lX1NlYXNvbiA6PSBmYWN0b3IoU3VydmV5X05hbWVfU2Vhc29uLCBsZXZlbHMgPSBzdXJ2ZXlfbmFtZV9zZWFzb25fb3JkZXJlZCldCgoKI21hcmsgc2lnbmlmaWNhbmNlCmludGVyYWN0aW9uX2F2Z19tb2RlbF9jb2VmWyxTaWduaWZpY2FudCA6PSBpZmVsc2UoKGVzdGltYXRlLXNlID4gMCAmIGVzdGltYXRlK3NlID4gMCkgfCAoZXN0aW1hdGUtc2UgPCAwICYgZXN0aW1hdGUrc2UgPCAwKSxULEYpXQoKCiNQbG90IGJvdGgKc2J0X2Zpc2hpbmdfYXZnX21vZGVsX2NvZWYgPC0gZ2dwbG90KCkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gImRvdHRlZCIpICsKZ2VvbV9wb2ludChkYXRhID0gaW50ZXJhY3Rpb25fYXZnX21vZGVsX2NvZWYsIGFlcyh4ID0gU3VydmV5X05hbWVfU2Vhc29uLCB5ID0gZXN0aW1hdGUsIGNvbG9yID0gU2lnbmlmaWNhbnQpKSArICAKZ2VvbV9lcnJvcmJhcihkYXRhID0gaW50ZXJhY3Rpb25fYXZnX21vZGVsX2NvZWYsIGFlcyh4ID0gU3VydmV5X05hbWVfU2Vhc29uLCB5bWluID0gZXN0aW1hdGUtc2UsIHltYXggPSBlc3RpbWF0ZStzZSwgY29sb3IgPSBTaWduaWZpY2FudCksIHdpZHRoID0gMCkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJkYXJrZ3JleSIsImJsYWNrIikpICsKZmFjZXRfd3JhcCh+cHJlZGljdG9yLCBzY2FsZXMgPSAiZnJlZV94IikgKwpzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cyA9IHJldikgKwogIGxhYnMoeSA9ICJDb2VmZmljaWVudCIsIHggPSAiIikgKwpjb29yZF9mbGlwKCkgKwp0aGVtZV9jbGFzc2ljKCkKICAKCgpgYGAKClBsb3QgYWxsIG90aGVyIGNvZWZmaWNpZW50cyBpbiBhdmVyYWdlZCBtb2RlbApgYGB7cn0KbW9kZWxfYXZnX3ZhbHVlcy5ub25maXNob3J0ZW1wIDwtIG1vZGVsX2F2Z192YWx1ZXNbYygyLDYsMTAyOjEwNiksXQoKI21hcmsgc2lnbmlmaWNhbmNlCm1vZGVsX2F2Z192YWx1ZXMubm9uZmlzaG9ydGVtcFssU2lnbmlmaWNhbnQgOj0gaWZlbHNlKChjb2VmLXNlID4gMCAmIGNvZWYrc2UgPiAwKSB8IChjb2VmLXNlIDwgMCAmIGNvZWYrc2UgPCAwKSxULEYpXQoKI21vcmUgaGVscGZ1bCBuYW1lcyBmb3IgdmFyaWFibGVzCm1vZGVsX2F2Z192YWx1ZXMubm9uZmlzaG9ydGVtcFssVmFyaWFibGUgOj0gYygiQXJlYSIsIlNwZWNpZXMgY291bnQiLCJEZXB0aCIsIk51bWJlciBvZiB0b3dzIiwiTGF0aXR1ZGUiLCJEZXB0aCByYW5nZSIsIkxhdGl0dWRlIHJhbmdlIildCgojbWFrZSBmYWN0b3Igd2l0aCBvcmRlcgptb2RlbF9hdmdfdmFsdWVzLm5vbmZpc2hvcnRlbXBbLFZhcmlhYmxlIDo9IGZhY3RvcihWYXJpYWJsZSwgbGV2ZWxzID0gYygiQXJlYSIsIlNwZWNpZXMgY291bnQiLCJOdW1iZXIgb2YgdG93cyIsIkRlcHRoIiwiRGVwdGggcmFuZ2UiLCJMYXRpdHVkZSIsIkxhdGl0dWRlIHJhbmdlIikpXQoKCiNwbG90CmFsbF9hdmdfbW9kZWxfY29lZiA8LSBnZ3Bsb3QoKSArIApnZW9tX3BvaW50KGRhdGEgPSBtb2RlbF9hdmdfdmFsdWVzLm5vbmZpc2hvcnRlbXAsIGFlcyh4ID0gVmFyaWFibGUsIHkgPSBjb2VmLCBjb2xvciA9IFNpZ25pZmljYW50KSkgKyAgCmdlb21fZXJyb3JiYXIoZGF0YSA9IG1vZGVsX2F2Z192YWx1ZXMubm9uZmlzaG9ydGVtcCwgYWVzKHggPSBWYXJpYWJsZSwgeW1pbiA9IGNvZWYtc2UsIHltYXggPSBjb2VmK3NlLCBjb2xvciA9IFNpZ25pZmljYW50KSwgd2lkdGggPSAwKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoImRhcmtncmV5IiwiYmxhY2siKSkgKwpnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArCnNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gcmV2KSArCiAgbGFicyh5ID0gIkNvZWZmaWNpZW50IiwgeCA9ICJcblxuXG4iKSArCmNvb3JkX2ZsaXAoKSArCnRoZW1lX2NsYXNzaWMoKQoKI3Bsb3QKYWxsX2J1dF9sYXRfYXZnX21vZGVsX2NvZWYgPC0gZ2dwbG90KCkgKyAKZ2VvbV9wb2ludChkYXRhID0gbW9kZWxfYXZnX3ZhbHVlcy5ub25maXNob3J0ZW1wW1ZhcmlhYmxlID09ICJMYXRpdHVkZSJdLCBhZXMoeCA9IFZhcmlhYmxlLCB5ID0gY29lZiwgY29sb3IgPSBTaWduaWZpY2FudCkpICsgIApnZW9tX2Vycm9yYmFyKGRhdGEgPSBtb2RlbF9hdmdfdmFsdWVzLm5vbmZpc2hvcnRlbXBbVmFyaWFibGUgPT0gIkxhdGl0dWRlIl0sIGFlcyh4ID0gVmFyaWFibGUsIHltaW4gPSBjb2VmLXNlLCB5bWF4ID0gY29lZitzZSwgY29sb3IgPSBTaWduaWZpY2FudCksIHdpZHRoID0gMCkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJkYXJrZ3JleSIsImJsYWNrIikpICsKZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKwpzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cyA9IHJldikgKwogIGxhYnMoeSA9ICJDb2VmZmljaWVudCIsIHggPSAiTW9kZWwgdmFyaWFibGUiKSArCmNvb3JkX2ZsaXAoKSArCnRoZW1lX2NsYXNzaWMoKQoKI3Bsb3QKbGF0X2F2Z19tb2RlbF9jb2VmIDwtIGdncGxvdCgpICsgCmdlb21fcG9pbnQoZGF0YSA9IG1vZGVsX2F2Z192YWx1ZXMubm9uZmlzaG9ydGVtcFtWYXJpYWJsZSAhPSAiTGF0aXR1ZGUiXSwgYWVzKHggPSBWYXJpYWJsZSwgeSA9IGNvZWYsIGNvbG9yID0gU2lnbmlmaWNhbnQpKSArICAKZ2VvbV9lcnJvcmJhcihkYXRhID0gbW9kZWxfYXZnX3ZhbHVlcy5ub25maXNob3J0ZW1wW1ZhcmlhYmxlICE9ICJMYXRpdHVkZSJdLCBhZXMoeCA9IFZhcmlhYmxlLCB5bWluID0gY29lZi1zZSwgeW1heCA9IGNvZWYrc2UsIGNvbG9yID0gU2lnbmlmaWNhbnQpLCB3aWR0aCA9IDApICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiZGFya2dyZXkiLCJibGFjayIpKSArCmdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsKc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHMgPSByZXYpICsKICBsYWJzKHkgPSAiQ29lZmZpY2llbnQiLCB4ID0gIk1vZGVsIHZhcmlhYmxlIikgKwpjb29yZF9mbGlwKCkgKwp0aGVtZV9jbGFzc2ljKCkKCiNtZXJnZSBpbnRvIHNpbmdsZSBwbG90Cgptb2RlbF9jb2VmX3N1bW1hcnlfc2J0X2phY2NhcmQgPC0gY293cGxvdDo6cGxvdF9ncmlkKHNidF9maXNoaW5nX2F2Z19tb2RlbF9jb2VmK3RoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJudWxsIiwgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpKSxhbGxfYXZnX21vZGVsX2NvZWYrdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm51bGwiKSwgbmNvbCA9IDEsIGxhYmVscyA9IGMoIiAgYS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLiIsIiAgICAgICAgYy4iKSwgbGFiZWxfeSA9IDAuOTksIHJlbF9oZWlnaHRzID0gYygzLDEpKQoKI0ZpZ3VyZSAzCmdnc2F2ZShtb2RlbF9jb2VmX3N1bW1hcnlfc2J0X2phY2NhcmQsIHBhdGggPSBoZXJlOjpoZXJlKCJmaWd1cmVzIiksZmlsZW5hbWUgPSAibW9kZWxfY29lZl9zdW1tYXJ5X3NidF9qYWNjYXJkLmpwZyIsIGhlaWdodCA9IDYuNSwgd2lkdGggPSA4LCB1bml0ID0gImluIikKZ2dzYXZlKG1vZGVsX2NvZWZfc3VtbWFyeV9zYnRfamFjY2FyZCwgcGF0aCA9IGhlcmU6OmhlcmUoImZpZ3VyZXMiKSxmaWxlbmFtZSA9ICJGaWczLnRpZmYiLCBoZWlnaHQgPSA2LjUsIHdpZHRoID0gOCwgdW5pdCA9ICJpbiIsIGRwaSA9IDMwMCwgY29tcHJlc3Npb24gPSAibHp3IikKCgpgYGAKCgoKIyMjSW52ZXN0aWdhdGluZyB3aGF0J3MgZ29pbmcgb24gd2l0aCBBbGV1dGlhbiBJc2xhbmRzCmBgYHtyfQoKCiNESVNTSU1JTEFSSVRZIFZTIFRFTVBFUkFUVVJFCmdncGxvdChkaXNzaW1pbGFyaXR5X2NvdmFyaWF0ZXNfZHJlZGdlLmR0W3N1cnZleV91bml0ID09ICJBSSJdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IHllYXJseV9taW5fYnlwb2ludF9hdmcsIHkgPSBhbm51YWxfZGlzc2ltaWxhcml0eV92YWx1ZSkpICsKICB0aGVtZV9jbGFzc2ljKCkKCiNJZiB3ZSBpZ25vcmUgdHdvIGNvbGRlc3QgeWVhcnMsIHdlIGhhdmUgcm91Z2hseSBwb2ludHMgYXQgKDIuMDcsMC43NikgYW5kICgyLjIsIDAuNjkpLCBzbG9wZSA9IC0xLjgsIHdoaWNoIG1hdGNoZXMgd2hhdCB3ZSBnZXQgKGFsc28gbm90ZSBsYXJnZSBjb25maWRlbmNlIGJvdW5kcykKCiNTbywgdGhlIHF1ZXN0aW9uIGlzLCB3aGF0IGlzIGxlYWRpbmcgdGhlIG1vZGVsIHRvIGlnbm9yZSB0aGVzZSB0d28geWVhcnM/IFdoYXQgZXhwbGFpbnMgdGhpcyB2YXJpYXRpb24gaW4gdGhlIGNvbGRlc3QgeWVhcnM/CgoKI0RJU1NJTUlMQVJJVFkKZ2dwbG90KGRpc3NpbWlsYXJpdHlfY292YXJpYXRlc19kcmVkZ2UuZHRbc3VydmV5X3VuaXQgPT0gIkFJIl0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gYXJlYV9rbSwgeSA9IGFubnVhbF9kaXNzaW1pbGFyaXR5X3ZhbHVlKSkgKwogIHRoZW1lX2NsYXNzaWMoKQoKI1ZlcnkgbGFyZ2Ugc2FtcGxpbmcgYXJlYSBhbmQgdmVyeSBsb3cgc2FtcGxpbmcgYXJlYXMgYXJlIGJvdGggbG93ZXN0IHZhbHVlcwoKCiAgICAgICNURU1QRVJBVFVSRQogICAgICBnZ3Bsb3QoZGlzc2ltaWxhcml0eV9jb3ZhcmlhdGVzX2RyZWRnZS5kdFtzdXJ2ZXlfdW5pdCA9PSAiQUkiXSkgKwogICAgICAgIGdlb21fcG9pbnQoYWVzKHggPSBhcmVhX2ttLCB5ID0geWVhcmx5X21pbl9ieXBvaW50X2F2ZykpICsKICAgICAgICB0aGVtZV9jbGFzc2ljKCkKICAgICAgCiAgICAgICNWZXJ5IGxhcmdlIHNhbXBsaW5nIGFyZWEgY29pbmNpZGVzIHdpdGggbG93ZXN0IHRlbXBlcmF0dXJlcwogICAgICAKCiNESVNTSU1JTEFSSVRZCmdncGxvdChkaXNzaW1pbGFyaXR5X2NvdmFyaWF0ZXNfZHJlZGdlLmR0W3N1cnZleV91bml0ID09ICJBSSJdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IHNwcF9jb3VudF9hbm51YWwsIHkgPSBhbm51YWxfZGlzc2ltaWxhcml0eV92YWx1ZSkpICsKICB0aGVtZV9jbGFzc2ljKCkKCiNBbm51YWwgZGlzc2ltaWxhcml0eSB2YWx1ZSBpbmNyZWFzZXMgd2l0aCByaWNobmVzcwoKICAgICNURU1QRVJBVFVSRQogICAgZ2dwbG90KGRpc3NpbWlsYXJpdHlfY292YXJpYXRlc19kcmVkZ2UuZHRbc3VydmV5X3VuaXQgPT0gIkFJIl0pICsKICAgICAgZ2VvbV9wb2ludChhZXMoeCA9IHNwcF9jb3VudF9hbm51YWwsIHkgPSB5ZWFybHlfbWluX2J5cG9pbnRfYXZnKSkgKwogICAgICB0aGVtZV9jbGFzc2ljKCkKICAgIAogICAgI0xvd2VzdCB0ZW1wZXJhdHVyZSBvYnNlcnZhdGlvbiBjb2luY2lkZXMgd2l0aCBsb3dlc3QgcmljaG5lc3MKCiNESVNTSU1JTEFSSVRZCmdncGxvdChkaXNzaW1pbGFyaXR5X2NvdmFyaWF0ZXNfZHJlZGdlLmR0W3N1cnZleV91bml0ID09ICJBSSJdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGhhdWxfaWRfY291bnRfYW5udWFsLCB5ID0gYW5udWFsX2Rpc3NpbWlsYXJpdHlfdmFsdWUpKSArCiAgdGhlbWVfY2xhc3NpYygpCgojTG93IG51bWJlciBvZiBoYXVscyBsZWQgdG8gdmVyeSBsb3cgYW5udWFsIGRpc3NpbWlsYXJpdHkgdmFsdWVzCgogICAgI1RFTVBFUkFUVVJFCiAgICBnZ3Bsb3QoZGlzc2ltaWxhcml0eV9jb3ZhcmlhdGVzX2RyZWRnZS5kdFtzdXJ2ZXlfdW5pdCA9PSAiQUkiXSkgKwogICAgICBnZW9tX3BvaW50KGFlcyh4ID0gaGF1bF9pZF9jb3VudF9hbm51YWwsIHkgPSB5ZWFybHlfbWluX2J5cG9pbnRfYXZnKSkgKwogICAgICB0aGVtZV9jbGFzc2ljKCkKICAgIAogICAgI0xvd2VzdCB0ZW1wZXJhdHVyZSBtYXRjaGVkIHdpdGggbG93ZXN0IG51bWJlciBvZiBzYW1wbGVzCgojRElTU0lNSUxBUklUWQpnZ3Bsb3QoZGlzc2ltaWxhcml0eV9jb3ZhcmlhdGVzX2RyZWRnZS5kdFtzdXJ2ZXlfdW5pdCA9PSAiQUkiXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBkZXB0aF9hbm51YWxfYXZnLCB5ID0gYW5udWFsX2Rpc3NpbWlsYXJpdHlfdmFsdWUpKSArCiAgdGhlbWVfY2xhc3NpYygpCgojU29tZSBkZWVwIHRyYXdscyBoYXZlIHZlcnkgbG93IGFubnVhbCBkaXNzaW1pbGFyaXR5LCB3aGlsZSBvdGhlciBkZWVwIHRyYXdscyBoYXZlIGhpZ2ggYW5udWFsIGRpc3NpbWlsYXJpdHkKCiAgICAgICNURU1QRVJBVFVSRQogICAgICBnZ3Bsb3QoZGlzc2ltaWxhcml0eV9jb3ZhcmlhdGVzX2RyZWRnZS5kdFtzdXJ2ZXlfdW5pdCA9PSAiQUkiXSkgKwogICAgICAgIGdlb21fcG9pbnQoYWVzKHggPSBkZXB0aF9hbm51YWxfYXZnLCB5ID0geWVhcmx5X21pbl9ieXBvaW50X2F2ZykpICsKICAgICAgICB0aGVtZV9jbGFzc2ljKCkKICAgICAgCiAgICAgICNEZWVwZXN0IHRyYXdscyBoYXBwZW5lZCBvbiBjb2xkIGRheXMKYGBgCldoYXQgbGVhZHMgdG8gdmFyaWFuY2UgYmVpbmcgZXhwbGFpbmVkIGJ5IHZhcmlhYmxlcyBPVEhFUiB0aGFuIHRlbXBlcmF0dXJlIGluIGNvbGRlc3QgeWVhcnMKU28sIGluIHN1bW1hcnkKLSBWZXJ5IGxhcmdlIHNhbXBsaW5nIGFyZWEgYW5kIHZlcnkgc21hbGwgc2FtcGxpbmcgYXJlYXMgYXJlIGJvdGggbGlua2VkIHRvIHllYXJzIG9mIGxvdyBkaXNzaW1pbGFyaXR5Ci0gKlZlcnkgbGFyZ2Ugc2FtcGxpbmcgYXJlYSogY29pbmNpZGVzIHdpdGggbG93ZXN0IHRlbXBlcmF0dXJlcwotIEFubnVhbCBkaXNzaW1pbGFyaXR5IHZhbHVlIGluY3JlYXNlcyB3aXRoIHJpY2huZXNzCi0gKkxvd2VzdCB0ZW1wZXJhdHVyZSBvYnNlcnZhdGlvbiBjb2luY2lkZXMgd2l0aCBsb3dlc3QgcmljaG5lc3MqCi0gTG93IG51bWJlciBvZiBoYXVscyBsZWQgdG8gdmVyeSBsb3cgYW5udWFsIGRpc3NpbWlsYXJpdHkgdmFsdWVzCi0gTG93ZXN0IHRlbXBlcmF0dXJlIG1hdGNoZWQgd2l0aCAqbG93ZXN0IG51bWJlciBvZiBzYW1wbGVzKgotIFNvbWUgZGVlcCB0cmF3bHMgaGF2ZSB2ZXJ5IGxvdyBhbm51YWwgZGlzc2ltaWxhcml0eSwgd2hpbGUgb3RoZXIgZGVlcCB0cmF3bHMgaGF2ZSBoaWdoIGFubnVhbCBkaXNzaW1pbGFyaXR5Ci0gKkRlZXBlc3QgdHJhd2xzIGhhcHBlbmVkIG9uIGNvbGQgZGF5cyoKCkZvciB0aGUgQWxldXRpYW4gaXNsYW5kcywgdGhlIGNvbGRlc3QgeWVhcnMgd2VyZSBhbHNvOgotIHRoZSB5ZWFycyBvZiBsYXJnZXN0IHNhbXBsaW5nIGFyZWEKLSB0aGUgeWVhcnMgb2YgbG93ZXN0IHJpY2huZXNzCi0gdGhlIHllYXJzIG9mIGxvd2VzdCBzYW1wbGluZyBlZmZvcnQgKCMgdG93cykKLSB0aGUgeWVhcnMgb2YgZGVlcGVzdCBzYW1wbGluZwoKCgojSUYgV0UgQUNUVUFMTFkgVVNFIFRISVMsIE5FRUQgVE8gVVBEQVRFCiMjU2hvdyBpbnRlcmNlcHRzIGJ5IHJlZ2lvbiBhbmQgc2Vhc29uCiMKI2BgYHtyfQojCiMjc3VydmV5IGludGVyY2VwdHMKI3N1cnZleV9pbnRlcmNlcHRzIDwtIG1vZGVsX2F2Z192YWx1ZXNbYygxLDg6MzgpLC4oY29lZl9uYW1lLCBjb2VmLCBzZSldCiNzdXJ2ZXlfaW50ZXJjZXB0c1sxLHN1cnZleV91bml0IDo9ICJBSSJdWzEsY29lZl90cnVlIDo9IGNvZWZdCiNzdXJ2ZXlfaW50ZXJjZXB0c1syOjMyLHN1cnZleV91bml0IDo9IHN1YnN0cihjb2VmX25hbWUsIDEyLCBzdHJfbGVuZ3RoKGNvZWZfbmFtZSkpXVsyOjMyLGNvZWZfdHJ1ZSA6PSBzdXJ2ZXlfaW50ZXJjZXB0c1sxLGNvZWZfdHJ1ZV0rY29lZl0KI3N1cnZleV9pbnRlcmNlcHRzIDwtIGNvbG9yX2xpbmtbc3VydmV5X2ludGVyY2VwdHMsIG9uID0gInN1cnZleV91bml0Il0KI3N1cnZleV9pbnRlcmNlcHRzWyxTdXJ2ZXlfTmFtZV9TZWFzb24gOj0gcmVvcmRlcihTdXJ2ZXlfTmFtZV9TZWFzb24sIGNvZWZfdHJ1ZSldCiMKIwojI3NlYXNvbl9pbnRlcmNlcHRzCiNzZWFzb25faW50ZXJjZXB0cyA8LSBtb2RlbF9hdmdfdmFsdWVzW2MoMSwzOjUpLC4oY29lZl9uYW1lLCBjb2VmLCBzZSldCiNzZWFzb25faW50ZXJjZXB0c1sxLHNlYXNvbiA6PSAiU3ByaW5nIl1bMSxjb2VmX3RydWUgOj0gY29lZl0KI3NlYXNvbl9pbnRlcmNlcHRzWzI6NCxzZWFzb24gOj0gc3Vic3RyKGNvZWZfbmFtZSwgNywgc3RyX2xlbmd0aChjb2VmX25hbWUpKV1bMjo0LGNvZWZfdHJ1ZSA6PSBzZWFzb25faW50ZXJjZXB0c1sxLGNvZWZfdHJ1ZV0rY29lZl0KI3NlYXNvbl9pbnRlcmNlcHRzWyxzZWFzb24gOj0gcmVvcmRlcihzZWFzb24sIGNvZWZfdHJ1ZSldCiMKIwojI3N1cnZleSBpbnRlcmNlcHRzCiNzdXJ2ZXlfbW9kZWxfY29lZiA8LSBnZ3Bsb3QoKSArCiNnZW9tX3BvaW50KGRhdGEgPSBzdXJ2ZXlfaW50ZXJjZXB0cywgYWVzKHggPSBTdXJ2ZXlfTmFtZV9TZWFzb24sIHkgPSBjb2VmX3RydWUpKSArICAKI2dlb21fZXJyb3JiYXIoZGF0YSA9IHN1cnZleV9pbnRlcmNlcHRzLCBhZXMoeCA9IFN1cnZleV9OYW1lX1NlYXNvbiwgeW1pbiA9IGNvZWZfdHJ1ZS1zZSwgeW1heCA9IGNvZWZfdHJ1ZStzZSksIHdpZHRoID0gMCkgKwojc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHMgPSByZXYpICsKIyMgIHlsaW0oMC4zNSwxKSArCiMgIGxhYnMoeSA9ICJJbnRlcmNlcHQiLCB4ID0gIiIpICsKI2Nvb3JkX2ZsaXAoKSArCiN0aGVtZV9jbGFzc2ljKCkKIyAgCiMjc2Vhc29uIGludGVyY2VwdHMKI3NlYXNvbl9tb2RlbF9jb2VmIDwtIGdncGxvdCgpICsKI2dlb21fcG9pbnQoZGF0YSA9IHNlYXNvbl9pbnRlcmNlcHRzLCBhZXMoeCA9IHNlYXNvbiwgeSA9IGNvZWZfdHJ1ZSkpICsgIAojZ2VvbV9lcnJvcmJhcihkYXRhID0gc2Vhc29uX2ludGVyY2VwdHMsIGFlcyh4ID0gc2Vhc29uLCB5bWluID0gY29lZl90cnVlLXNlLCB5bWF4ID0gY29lZl90cnVlK3NlKSwgd2lkdGggPSAwKSArCiNzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cyA9IHJldikgKwojICMgeWxpbSgwLjM1LDEpICsKIyAgbGFicyh5ID0gIkludGVyY2VwdCIsIHggPSAiIikgKwojY29vcmRfZmxpcCgpICsKI3RoZW1lX2NsYXNzaWMoKQojCiMjbWVyZ2UgaW50byBzaW5nbGUgcGxvdAojCiNtb2RlbF9pbnRlcmNlcHRfamFjY2FyZCA8LSBjb3dwbG90OjpwbG90X2dyaWQoc3VydmV5X21vZGVsX2NvZWYrdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpKSwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vhc29uX21vZGVsX2NvZWYsIG5jb2wgPSAxLCBsYWJlbHMgPSBjKCJhLiIsImIuIiksIGxhYmVsX3kgPSAwLjk5LCByZWxfaGVpZ2h0cyA9IGMoMywxKSwgYWxpZ24gPSAidiIpCiMKI2dnc2F2ZShtb2RlbF9pbnRlcmNlcHRfamFjY2FyZCwgcGF0aCA9IGhlcmU6OmhlcmUoImZpZ3VyZXMiKSxmaWxlbmFtZSA9ICJtb2RlbF9pbnRlcmNlcHRfamFjY2FyZC5qcGciLCBoZWlnaHQgPSA2LjUsIHdpZHRoID0gNi41LCB1bml0ID0gImluIikKIwojCiMKI2BgYCM=